首页 > 代码库 > 例题 2-1 aabb 2-2 3n+1问题
例题 2-1 aabb 2-2 3n+1问题
例题2-1 aabb
输出所有形如aabb的四位完全平方数(即前两位数字相等,后两位数字也相等)
#include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc, char *argv[]) { int i, j, n; double m; for(i = 1; i <= 9; i++) for(j = 0; j <= 9; j++) { n = i*1100 + j*11; //n = (i*10+i)*100 + j*10 + j; m = sqrt(n); if(floor(m+0.5) == m) printf("%d\n", n); } system("PAUSE"); return 0; } int main(int argc, char *argv[]) { int x, y; for(x = 33; x*x <= 9999; x++) { y = x*x; if(y/1000 == y/100%10 && y/10%10 == y%10) printf("%d\n", y); } system("PAUSE"); return 0; }总结:1 一组逆向的思维解决同一个问题
2 用变量n = a*1100 + b*11来储存四位数
3 浮点运算会存在误差。在进行浮点数误差时,应考虑到浮点误差 如 floor(m+0.5) == m
例题2-2 3n+1问题 猜想:对于任意大于1的自然数n,若n为奇数,则将n变成3n+1,否则变成一半 经过若干次这样的变换,一定会使n变成1.例如3->10->5->16->8->4->2->1 输入n,输出变换的次数。n≤10^9. 样例输入:3 样例输出:7
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { unsigned n, count = 0; scanf("%d", &n); while(n > 1) { if(n % 2 == 1) { n = n + (n+1)/2; count += 2; continue;} else n >>= 1 ; count++; } printf("%d\n", count); system("PAUSE"); return 0; }总结:1 3n+1会溢出
2 一个临时的解决方案是:因为n为奇数事3*n+1一定是偶数,下一步将其立刻除以2.如果将两次操作一起做,可以在一定程度上缓解这个问题。有兴趣的读者可以试一 试。程序特点,要善于发现。
3 除以2 用右移操作
4 (3n+1)/2不如写做 n + (n+1)/2,减少溢出的可能
例题2-3 阶乘之和
输入n,计算S=1!+2!+3!+……+n!的末6位(不含前导0),n≤10^6
#include <cstdlib> #include <stdio.h> int main() { const int MOD = 1000000; int n; long long sum = 0, tem = 1; scanf("%d",&n); for (int i=1; i<=n; i++) { tem = tem*i%MOD ; sum = (sum+tem)%MOD; } printf("%d\n",sum); system("PAUSE"); return EXIT_SUCCESS; }
总结:1 算术溢出,用每步除MOD的方式来解决
2 本题特性,当n>25时,结果就不变了,善于发现题目特点
例题 2-1 aabb 2-2 3n+1问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。