C语言之自守数
自守数
自守数是指一个数的平方的尾数等于该数自身的自然数,如25*25=625,76*76=5776.要求求出一定范围内的所有自守数。
题目分析:
刚拿到这个题目的时候认为解题关键在于,测试该数平方数的尾数和该数自身的自然数相等问题。导出新问题如何求出该平方数的尾数,要取和自然数位数相同的位数该怎么取。
看了一下标准答案如下,表示细节方面看不懂,贴出如下:
- #include<stdio.h>
- int main(void)
- {
- long i, j, k1, k2, k3, a[10] = {0}, num, m, n, sum; /*定义变量及数组为长整形*/
- printf("请输入一个数表示范围:\n");
- scanf("%ld", &num); /*从键盘中输入要求的范围*/
- printf("结果是:");
- for (j = 0; j < num; j++) /*对该范围内的数逐个试探*/
- {
- m = j;
- n = 1;
- sum = 0;
- k1 = 10;
- k2 = 1;
- while (m != 0) /*判断该数的位数*/
- {
- a[n] = j % k1; /*分离出的数存入数组中*/
- n++; /*记录位数,实际位数为n-1*/
- k1 *= 10; /*最小n位数*/
- m = m / 10;
- }
- k1 = k1 / 10;
- k3 = k1;
- for (i = 1; i <= n - 1; i++)
- {
- sum += (a[i] / k2 * a[n - i]) % k1 * k2; /*求每一部分积之和*/
- k2 *= 10;
- k1 /= 10;
- }
- sum = sum % k3; /*求和的后n-1位*/
- if (sum == j)
- printf("%5ld", sum); /*输出找到的自守数*/
- }
- printf("\n");
- return 0;
- }
效果图如下:

不过看到数组后产生灵感,想了个办法用while循环结合一个变量来统计自然数的位数,然后求出10的位数平方,用平方数对其求余再和自然数比较,并采用了模块化设计。
代码如下:
- #include<stdio.h>
- int ss(long);
- int main(void)
- {
- int i;
- long sum;
- scanf("%ld",&sum);
- for(i=0;i<=sum;i++)
- {
- if(ss(i)) //判断是否符合要求
- printf("%d ",i);
- }
- printf("\n");
- return 0;
- }
- int ss(long value)
- {
- int i,n=0,k=1;
- long temp=value,result; //用long型防止溢出,用一个temp来复制变量,保留一个原样。
- long ch=value*value; //求平方数
- while(temp!=0)
- {
- n++; //统计自然数的位数
- temp/=10;
- }
- for(i=0;i<n;i++)
- k=k*10; //求出取余的数
- result=ch%k; //求余
- if(value==result) //测试
- return 1;
- return 0;
- }
效果图如下:

个人觉得对比给出的标准答案改进有
一、代码行数减少了
二、进行了模块化设计
三、未使用数组
四、更易理解
C语言之自守数的更多相关文章
- 自守数算法----C语言实现
#include <stdio.h> //自守数算法 //ep : 25 ^ 2 = 625 76 ^ 2 = 5776 9376 ^ 2 = 87909376 /*ep : * 376 ...
- 1091 N-自守数 (15 分)C语言
如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为"N-自守数".例如 3×92^2 =25392,而 25392 的末尾两位正好是 92,所以 ...
- HW--自守数
package testcase; import huawei.Demo; import junit.framework.TestCase;//加入测试框架,不需要写Main函数 public cla ...
- 1091 N-自守数
如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”.例如 3×922=25392,而 25392 的末尾两位正好是 92,所以 92 是一个 3-自守 ...
- PAT 乙级 1091 N-自守数 (15 分)
1091 N-自守数 (15 分) 如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”.例如 3×922=25392,而 25392 的末尾两位正好是 ...
- pat乙级 1091 N-自守数 (15 分)
如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”.例如 3×922=25392,而 25392 的末尾两位正好是 92,所以 92 是一个 3-自守 ...
- 1091 N-自守数 (15 分)
如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”.例如 3×922=25392,而 25392 的末尾两位正好是 92,所以 92 是一个 3-自守 ...
- C语言变长參数的认识以及宏实现
1.认识 变长參数是C语言的特殊參数形式.比如例如以下函数声明: int printf(const char *format, ....); 如此的声明表明,printf函数除了第一个參数类型为con ...
- B1091 N-自守数 (15分)
B1091 N-自守数 (15分) 如果某个数 \(K\)的平方乘以\(N\) 以后,结果的末尾几位数等于 \(K\),那么就称这个数为"\(N\)-自守数".例如 \(3×92 ...
随机推荐
- clistctrl 虚拟列表
一.什么是虚拟列表控件 虚拟列表控件是指带有LVS_OWNERDATA风格的列表控件.. 二.为什么使用虚拟列表控件 我们知道,通常使用列表控件CListCtrl,需要调用InsertItem把要显示 ...
- 多线程编程之二 ---MFC中的多线程开发
下载源代码 五.MFC对多线程编程的支持 MFC中有两类线程,分别称之为工作者线程和用户界面线程.二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环. 工作者线程没有消 ...
- Java图形化界面设计——布局管理器之null布局(空布局)
一般容器都有默认布局方式,但是有时候需要精确指定各个组建的大小和位置,就需要用到空布局. 操作方法: 1) 首先利用setLayout(null)语句将容器的布局设置为null布局(空布局 ...
- STC15?MSP430?ARM?DSP?
自从大学毕业以来,发现属于自己的时间越来越少,每天忙于工作,导致在大学学到的东西都好生疏,特别是大一刚开始学的模电,单片机等,现在才慢慢的抓起来,然后在这个多核处理器流行的时代,单片机貌似快过时了,但 ...
- Flex和Servlet结合上传文件报错(二)
1.详细报错例如以下 一个表单域 不是一个表单域 java.io.FileNotFoundException: D:\MyEclipse\workspace\FlexFileUpload\Web\up ...
- tar.xz文件怎样解压
XZ压缩最新压缩率之王 xz这个压缩可能非常多都非常陌生,只是您可知道xz是绝大数linux默认就带的一个压缩工具. 之前xz使用一直非常少,所以差点儿没有什么提起. 我是在下载phpmyadmin的 ...
- ##DAY1 UI、frame、center、bounds、UIVIew
##DAY1 UI.frame.center.bounds.UIVIew #pragma mark ———————UI——————————— UI的本意是用户界面,是英文User和 Interface ...
- PHP-购物网站开发设计(二)
2015-07-7 今天介绍购物网站的后台数据库设计,数据库使用的是MySQL (1)在MySQL数据库中新建Database,命名为test (2)在test下新建三个数据表,分别为mismatch ...
- BZOJ 2662: [BeiJing wc2012]冻结(最短路)
这道题和 BZOJ 2763飞行路线 几乎一模一样..然后飞行路线我是1A,这道题WA了4次,我开始怀疑我的智商了.. ---------------------------------------- ...
- C++对象模型--C++对象模型
何为C++对象模型? 部分: 1 语言中直接支持面向对象程序设计的部分 2 对于各种支持的底层实现机制 语言中直接支持面向对象程序设计的部分,如构造函数.析构函数.虚函数.继承 ...