1001 害死人不偿命的(3n+1)猜想
卡拉兹(Callatz)猜想:
对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?
输入格式:每个测试输入包含 1 个测试用例,即给出正整数 n 的值。
输出格式:输出从 n 计算到 1 需要的步数。
输入样例
3
输出样例代码:
5
代码:
#include<stdio.h> int main(){ int n, count = 0; scanf("%d", &n); while(n != 1){//n进入循环,直到n=1 if(n % 2 == 1){//n为奇数时 n = 3 * n + 1; n /= 2; } else{//n为偶数时 n /= 2; } count++; } printf("%d", count); }
1011 A+B 和 C
给定区间 [−231,231] 内的 3 个整数 A、B 和 C,请判断 A+B 是否大于 C。
输入格式:
输入第 1 行给出正整数 T (≤10),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。
输出格式:对每组测试用例,在一行中输出 Case #X: true
如果 A+B>C,否则输出 Case #X: false
,其中 X
是测试用例的编号(从 1 开始)。
输入样例:
4 1 2 3 2 3 4 2147483647 0 2147483646 0 -2147483648 -2147483647
输出样例:
Case #1: false Case #2: true Case #3: true Case #4: false
代码:
#include<stdio.h> int main() { int times, i;//times用于判断次数,i用于遍历数组 scanf("%d", ×); struct Num {//定义结构体数组Num,用于存放每次输入的数据(也可以不设置结构体) long long num1, num2, num3; }number[10]; for (i = 0; i < times;) { //循环输入数据 scanf("%lld %lld %lld", &number[i].num1, &number[i].num2, &number[i].num3); //判断A + B > C if (number[i].num1 + number[i].num2 > number[i].num3) { printf("Case #%d: true\n", ++i);//因为i为数组下标,所以需要++i } else { printf("Case #%d: false\n", ++i); } } return 0; }
1016 部分A+B
正整数 A 的“DA(为 1 位整数)部分”定义为由 A 中所有 DA 组成的新整数 PA。例如:给定 A=3862767,DA=6,则 A 的“6 部分”PA 是 66,因为 A 中有 2 个 6。
现给定 A、DA、B、DB,请编写程序计算 PA+PB。
输入格式:
输入在一行中依次给出 A、DA、B、DB,中间以空格分隔,其中 0<A,B<109。
输出格式:
在一行中输出 PA+PB 的值。
输入样例 1:
3862767 6 13530293 3
输出样例 2:
3862767 1 13530293 8
输出样例 2:
0
代码:
#include<stdio.h> #include<math.h> int getNum(int num, int digit) { int i, temp; for (i = -1; num > 0;) { temp = num % 10;//每次对10取模得到最后一位数字 if (temp == digit) {//判断数字中有几个数字是和传入的参数相同 i++; } num /= 10;//每次除10,小数点左移一位,即删除最后一位数字 } //也可以采用temp = temp * 10 + digit的方式得到最后结果,这样可以不用使用头文件<math.h> for (temp = 0; i >= 0; i--) {//每次加上要求匹配数字的10的i次方,继而得到最终结果 temp = temp + digit * pow(10, i); } return temp; } int main() { int num1, num2, digit1, digit2, result1, result2; scanf("%d%d%d%d", &num1, &digit1, &num2, &digit2); result1 = getNum(num1, digit1); result2 = getNum(num2, digit2); printf("%d", result1 + result2); }