算法15---数论4---自守数

算法15---数论4---自守数

如果一个正整数的平方的末尾几位数等于这个数本身,那么这个数便称为自守数。

自守数有如下的一些性质

(1) 以自守数为后几位的两数相乘,结果的后几位仍是自守数;

(2) n+1位的自守数出自n为的自守数。

(3) 两个n位子守数的和等于10的n次方加1.

我们给出两种自守数的算法

  1 /*
  2     题目:自守数
  3     author taoliu——alex  2016.10
  4
  5     主要实现:
  6     判断自守数;
  7
  8 */
  9
 10
 11 #include <stdio.h>
 12 #include <math.h>
 13
 14 int digit(long n)
 15 {
 16     int count=0;//记录n的位数,这种方法比我在水仙花数中之前用到的有点不同。
 17
 18     while(n>0)
 19     {
 20         n=n-(long)pow(10,count);
 21
 22         count++;
 23     }
 24     return count-1;
 25 }
 26
 27 /*
 28 这是一种最为直观的方法求自手术,但是这样也会存在一定的问题,就是当n比较大的时候
 29 要求n的平方,结果就会非常的大,印象计算速度,另一方面也容易造成数据范围溢出。
 30 */
 31 int zishoushu1(long n)
 32 {
 33     int digit_capacity=digit(n);//求n的位数
 34     long temp=(n*n)%(long)(pow(10,digit_capacity));
 35     if (temp==n)
 36     {
 37         return 1;
 38     }
 39     else
 40         return 0;
 41 }
 42
 43 /*
 44
 45 在这里我们采用另一种方法来求,我们只需要知道后面的即为,但是在乘法计算中
 46 后面的位数并不是需要与所有的被成熟想成才能知道的。
 47 下面我们以625的平方为例来说明。
 48         6 2 5
 49     X   6 2 5
 50     ——————————
 51       3 1 2 5
 52     1 2 5 0
 53   3 7 5 0
 54   _____________
 55   3 9 0 6 2 5
 56
 57   对于自守数625来说,我们只需要知道后面的3位数就行了,而不必计算整个平方的
 58   结果,在上面计算的过程中可知道并不是它的每一位都会对乘积的后三位产生影响。
 59   规律如下:
 60       对于个位数与被乘数相乘的积中,用被乘数的后3位625与乘数的个位5相乘;
 61       对于十位数与被乘数相乘的积中,用被乘数的后2位25与乘数的十位20相乘;
 62       对于百位数与被乘数相乘的积中,用被乘数的后1位5与乘数的百位600相乘;
 63   对于以上各位相乘的积累加,再取最后三位即可。
 64   实现如下:
 65 */
 66
 67 //用一个函数得到num的后n位,如124后2位24;
 68 long cut_num(long num,int n)
 69 {
 70     int c_t=digit(num);
 71
 72     if (n>c_t)
 73     {
 74         printf("worry n !\n");
 75     }
 76     long m=num;//用来保存后n位
 77     m=m%(long)(pow(10,n));
 78     return m;
 79 }
 80
 81  int zishoushu2(long num)
 82  {
 83      long sum=0;
 84      int i=1;
 85      int count = digit(num);
 86      //printf("the count is %d\n",count);
 87      int count2=count;
 88      while(count>0)
 89      {
 90          sum=sum+cut_num(num,count)*(cut_num(num,i)-cut_num(num,i-1));
 91          count--;
 92          i++;
 93      }
 94      long ans=cut_num(sum,count2);
 95      printf("the ans is %ld\n",ans );
 96      if(ans==num)
 97      {
 98          return 1;
 99      }
100      else
101          return 0;
102
103
104  }
105
106
107 int main()
108 {
109     printf("please input the  number you want to judge! \n");
110     long n;
111     scanf("%ld",&n);
112     int judge=zishoushu2(n);
113     if (judge==1)
114     {
115         printf("the number %ld is zishou number \n",n );
116     }
117     else
118         printf("the number %ld is not zishou number \n",n );
119     return 0;
120 }
 1 /*
 2     题目:保存数字的后n位
 3     author taoliu——alex  2016.10
 4
 5     疑惑点:
 6     为什么后两位就出错,此外其他位都没有问题
 7     比如
 8     625  后两位的结果显示31,但是其他为都正常,我找不出原因。
 9     后来换了其他的编辑器,显示的没问题,看来我这个编辑器有点问题啊
10
11
12
13 */
14 #include <stdio.h>
15 #include <math.h>
16
17 int digit(long n)
18 {
19     int count=0;//记录n的位数,这种方法比我在水仙花数中之前用到的有点不同。
20
21     while(n>0)
22     {
23         n=n-(long)pow(10,count);
24
25         count++;
26     }
27     return count-1;
28 }
29
30 long cut_num(long num,int n)
31 {
32     int c_t=digit(num);
33
34     if (n>c_t)
35     {
36         printf("worry n !\n");
37     }
38     long m=num;//用来保存后n位
39     m=m%(long)(pow(10,n));
40     return m;
41 }
42
43
44 int main()
45 {
46     long ans=cut_num(625,2);
47     printf("%ld\n",ans);
48     return 0;
49 }

换了编译器后的结果显示

时间: 2024-10-05 18:02:19

算法15---数论4---自守数的相关文章

PAT 乙级 1091 N-自守数 (15 分)

1091 N-自守数 (15 分) 如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为"N-自守数".例如 3×92?2??=25392,而 25392 的末尾两位正好是 92,所以 92 是一个 3-自守数. 本题就请你编写程序判断一个给定的数字是否关于某个 N 是 N-自守数. 输入格式: 输入在第一行中给出正整数 M(≤20),随后一行给出 M 个待检测的.不超过 1000 的正整数. 输出格式: 对每个需要检测的数字,如果它是 N-自守数就在一行中

B1091 N-自守数 (15分)

B1091 N-自守数 (15分) 如果某个数 \(K\)的平方乘以\(N\) 以后,结果的末尾几位数等于 \(K\),那么就称这个数为"\(N\)-自守数".例如 \(3×92 ?^2 ?=25392\),而 25392 的末尾两位正好是 92,所以 92 是一个 3-自守数. 本题就请你编写程序判断一个给定的数字是否关于某个 N 是 N-自守数. 输入格式: 输入在第一行中给出正整数 \(M(≤20)\),随后一行给出 \(M\) 个待检测的.不超过 1000 的正整数. 输出格式

1091 N-自守数 (15分)

如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”.例如 3,而 2 的末尾两位正好是 9,所以 9 是一个 3-自守数. 本题就请你编写程序判断一个给定的数字是否关于某个 N 是 N-自守数. 输入格式: 输入在第一行中给出正整数 M(≤),随后一行给出 M 个待检测的.不超过 1000 的正整数. 输出格式: 对每个需要检测的数字,如果它是 N-自守数就在一行中输出最小的 N 和 NK?2?? 的值,以一个空格隔开:否则输出 No.注意题目保证 0

【华为OJ】【060-自守数】

[华为OJ][算法总篇章] [华为OJ][060-自守数] [工程下载] 题目描述 自守数是指一个数的平方的尾数等于该数自身的自然数.例如:252 = 625,762 = 5776,93762 = 87909376. 请求出n以内的自守数的个数 接口说明 /** * 功能: 求出n以内的自守数的个数 * * 输入参数:int n * 返回值:n以内自守数的数量. */ public static int calcAutomorphicNumbers(int n) { /*在这里实现功能*/ re

华为初级——自守数

描述:自守数是指一个数的平方的尾数等于该数自身的自然数.例如:25^2=625,76^2=5776,9376^2=87909376.请求出n以内的自守数的个数 接口说明 原型:unsigned int CalAutomorphicNumbers(unsigned int n); 输入参数:unsigned int n 返回值:n以内自守数的数量 知识点: 题目来源:内部整理 练习阶段:初级 运行时间限制:10sec 内存限制:128MByte 输入:输入一个整数 输出:输出一个整数 样例输入:2

编程算法 - 把数组排成最小的数 代码(C)

把数组排成最小的数 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个正整数数组, 把数组里所有数字拼接起来排成一个数, 打印能拼接出的所有数字中最小的一个. 大数转换为字符串, 重载快速排序的比较方法, 进行排序, 最后拼接. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdi

自守数

import java.util.Scanner; public class GetSelfConttrolledNum { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); int count = getSelfControlledNum(num); System.out.println(count); } private static in

1108: 零起点学算法15——交换变量

1108: 零起点学算法15--交换变量 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 3266  Accepted: 1706[Submit][Status][Web Board] Description 水题 Input 输入2个整数(题目包含多组测试数据) Output 输出交换后的2个整数(每组测试数据一行,中间用空格隔开) Sample Input 825 23 Sample Outpu

普林斯顿公开课 算法1-5:算法理论

本节主要讲解的是算法的复杂度. 算法性能 算法的性能分为三种: 最佳情况:计算时间最短的情况 最差情况:计算时间最长的情况 平均情况:随机输入的期望开销 以二分查找为例 最佳情况是1,因为第一次就有可能找到需要找的整数. 最差情况是logN 平均情况是logN 算法复杂度 算法复杂度用于定义问题的难度,另外也有助于开发最优化的算法,算法复杂度可以通过分析最坏情况来减少输入数据对算法性能的影响. 为了简化问题难度的表示方法,算法复杂度减少了算法分析的细节,忽略常数系数. 最优算法 所谓的最佳算法就