大學生新聞網,大學生新聞發布平臺
大學生新聞網
大學生新聞大學生活校園文學大學生村官
社會實踐活動社會實踐經歷社會實踐報告社會實踐總結社會實踐心得
全國排名校友會版軟科排名分類排名本科排名一本排名二本排名專科排名學校地址
求職簡歷職場法則面試技巧職場故事求職招聘大學生就業
英語學習計算機學習電氣工程機械工程經濟管理建筑設計財務會計
申請書證明書檢討書自薦信演講稿心得體會調查報告讀后感求職信推薦信其它范文

C語言求自守數

自守數是指一個數的平方的尾數等于該數自身的自然數。例如:

52 = 25 252 = 625 762 = 5776 93762 = 87909376

求100000以內的自守數。
問題分析
根據自守數的定義,求解本題的關鍵是知道當前所求自然數的位數,以及該數平方的尾數與被乘數、乘數之間的關系。
算法設計
若采用“求出一個數的平方后再截取最后相應位數”的方法顯然是不可取的,因為計算機無法表示過大的整數。

分析手工方式下整數平方(乘法)的計算過程,以376為例:




本問題所關心的是積的最后三位。分析產生積的后三位的過程可以看出,在每一次的部分積中,并不是它的每一位都會對積的后三位產生影響。總結規律可以得到:在三位數乘法中,對積的后三位產生影響的部分積分別為:

第一個部分積中:被乘數最后三位×乘數的倒數第一位。
第二個部分積中:被乘數最后二位×乘數的倒數第二位。
第三個部分積中:被乘數最后一位×乘數的倒數第三位。

將以上的部分積的后三位求和后,截取后三位就是三位數乘積的后三位,這樣的規律可以推廣到同樣問題的不同位數乘積中。
分離給定數中的最后幾位
從一個兩位數(存在變量n中)開始分析,分離最低位個位n%10;對于三位數n,分離最后兩位n%100;對于四位數n,分離最后三位n%1000;...,由此可見,若分離出最后x位,只需要用原數對 10x 求余。

從第3部分所舉例子可以看出,對于第二個部分積“2632”來說其實應是“26320”, 因為對于乘數中的倒數第二位“7”來說,因其在十位,對應的權值為10,第二個部分積實質上為:376X70=26320。故求部分積的程序段為:


int main ()
{
    //...
    while(k>0)
    {
        mul=( mul + ( number%(k*10) )*( number%b - nxuober%(b/10) ) )%a;
        /* (部分積+截取被乘數的后N位*截取乘數的第M位),%a再截取部分積*/
        k /= 10;  /*k為截取被乘數時的系數*/
        b *= 10;
    }
    //...
    return 0;
}
對于整個循環來說,變量k是由number的位數確定截取數字進行乘法時的系數。第1次執行循環體時,被乘數的所有位數都影響到平方的尾數,因此第1個部分積=被乘數*乘數的最后一位,將部分積累加到變量mul上,再對a取余截取相應的尾數位數;第2次執行循環體,影響平方尾數的是被乘數中除了最高位之外的數(所以k先除以10再參加運算),第2個部分積=被乘數*乘數的倒數第二位,( number%b - number%(b/l0) )用來求乘數中影響平方尾數的對應位上的數;第3次、第4次執行循環體的過程同上。

程序流程圖:



下面是完整的代碼:

#include<stdio.h>
int main()
{
    long mul, number, k, a, b;
    printf("It exists following automorphic nmbers small than 100000:\n");
    for( number=0; number<100000; number++ )
    {
        for( mul=number, k=1; (mul/=10)>0; k*=10 );
        /*由number的位數確定截取數字進行乘法時的系數k*/
        a = k * 10;  /*a為截取部分積時的系數*/
        mul = 0;  /*積的最后n位*/
        b = 10;  /*b為截取乘數相應位時的系數*/
        while(k>0)
        {
            mul=( mul + ( number%(k*10) )*( number%b - number%(b/10) ) )%a;
            /*(部分積+截取被乘數的后N位*截取乘數的第M位),%a再截取部分積*/
            k /= 10;  /*k為截取被乘數時的系數*/
            b *= 10;
        }
        if(number == mul)  /*判定若為自守數則輸出*/
            printf("%ld   ", number);
    }
    printf("\n");
    
    return 0;
}</stdio.h>
運行結果:
It exists following automorphic nmbers small than 100000:
0 1 5 6 25 76 376 625 9376 90625
    作者:大學生新聞網    來源:大學生新聞網
    發布時間:2025-03-11    閱讀:
    掃一掃 分享悅讀
  • C語言水仙花數
  • 輸出所有的“水仙花數”,所謂的“水仙花數”是指一個三位數其各位數字的立方和等于該數本身,例如153是“水仙花數”,因為:153 = 13
  • 03-11 關注:0
  • C語言求自守數
  • 自守數是指一個數的平方的尾數等于該數自身的自然數。
  • 03-11 關注:0
  • C語言求親密數
  • C語言求親密數
  • 如果整數A的全部因子(包括1,不包括A本身)之和等于B;且整數B的全部因子(包括1,不包括B本身)之和等于A
  • 03-11 關注:0
  • C語言求完數(完全數)
  • C語言求完數(完全數)
  • 如果一個數等于它的因子之和,則稱該數為“完數”(或“完全數”)。例如,6的因子為1、2、3,而 6=1+2+3,因此6是“完數”。
  • 03-11 關注:1
  • C語言輸出菱形(詳解版)
主站蜘蛛池模板: 2020狠狠操| 91大神在线精品网址| 欧美日韩亚洲国产一区二区三区| 国产日产精品_国产精品毛片| 中文字幕乱人伦视频在线| 欧美精品久久久久久久自慰| 国产午夜无码福利在线看网站| www.天天干| 日韩爽爽爽视频免费播放| 免费无码AV一区二区三区| 欧美jizzjizz在线播放| 妇女被猛烈进入在线播放 | 日本亚州视频在线八a| 亚洲色大情网站www| 韩国一级淫片漂亮老师| 在线播放免费人成毛片试看| 久久婷婷五月综合97色一本一本| 男人j桶女人j免费视频| 国产区视频在线观看| 99久热只有精品视频免费观看17| 日本特黄特色免费大片| 亚洲精品aaa| 老司机深夜网站| 国产精品一久久香蕉国产线看观看| 一看就湿的性行为描写大尺度 | 亚洲精品国产第1页| 色综合天天综合网国产成人网| 国产精品视频免费一区二区| 中文字幕人妻三级中文无码视频| 欧美亚洲国产精品久久高清| 再深点灬舒服了灬太大了乡村| 成人爽爽激情在线观看| 在线免费视频一区二区| 中文字幕精品一区二区精品| 欧美xx性在线| 人人爽人人爽人人片av免费| 草莓app在线观看| 国产精品一国产精品| a级片免费在线| 新版天堂资源在线官网8| 亚洲中文字幕久久精品无码喷水 |