Problem B: 求餘數
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 391 Solved: 135
[Submit][Status][Web Board]
Description
給定一個數n,將自然數從1開始一直排列到n依次連接起來之後組成一個新數X,求X除以9的餘數是多少
舉個栗子:n爲10,則x爲12345678910,你給的答案是1
Input
多組測試數據,每組給定一個正整數n(1<=n<=109)
Output
對於每個n輸出對應的餘數。
Sample Input
Sample Output
HINT
解題思路:找規律。根據輸入的數據n,有如下規律:
n=1;1%9=1;
n=2;12%9=3;
n=3;123%9=6;
n=4;1234%9=1;
n=5;12345%9=6;
n=6;123456%9=3;
n=7;1234567%9=1;
n=8;12345678%9=0;
n=9;123456789%9=0;
n=10;12345678910%9=1;
n=11;1234567891011%9=3;
……依次類推。發現規律,序列對9的餘數在0,1,3,6,1,6,3,1,0之間取值。因此將0,1,3,6,1,6,3,1,0存入數組a;然後尋找對應關係,多次探索發現,n=n%9;a[n]就爲1--n組成數字對9取餘的餘數。
解題心得:
一開始,是用的同餘定理求的,即將數字的每一位數加起來的和,用和對9取餘,與1--n組成數字對9取餘的餘數相同,結果超時。後來也是問同學才知道的解題方法。
附上1--n組成數字的各個位數數字的和計算代碼。
int sum(int i)
{
if(i>9)
{
return i%10+sum(i/10);
}
else
{
return i;
}
}
ac代碼:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[10] = {0,1,3,6,1,6,3,1,0};
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
n = n%9;
printf("%d\n",a[n]);
}
return 0;
}
若其他有問題可以在評論區一起討論。