九的余数--模拟有余数除式--O(n)*ncase

传送门


九的余数

时间限制: 3000 ms  |  内存限制: 65535 KB
难度: 3
描述

现在给你一个自然数n,它的位数小于等于一百万,现在你要做的就是求出这个数整除九之后的余数。

输入
第一行有一个整数m(1<=m<=8),表示有m组测试数据;
随后m行每行有一个自然数n。
输出
输出n整除九之后的余数,每次输出占一行。
样例输入
3
4
5
465456541
样例输出
4
5
4

分析

说来很惭愧作为一个二年级的小学支教老师这个题目我几乎是超时了一下午,最后实在讨论区一位同学的启发下过的,为什么会超时呢,因为c++类里面的一些操作函数在面临着成千上万次调用的时候是非常耗时的。比如说什么erase啊,substr啊,为了偷懒,咳咳,是为了节约时间我还利用了atoi函数来进行转换,结果表明在成千上万次的这种调用的情况下这些封装好的函数十分的耗时,所以利用迭代的方法遍历一遍整个的大数就可以模拟出来有余数除式的效果

超时代码

01. #include <iostream>
02. #include<string>
03. #include<stdlib.h>
04. #include<bits/stdc++.h>
05. using namespace std;
06. #define MAXN 210
07. int data[MAXN];
08. string number;
09. int m;
10. int n;
11. void print_result()
12. {
13. while(number.size()>1)
14. {
15. string t=number.substr(0,2);
16. int tnum=atoi(t.c_str());
17. int yushu=tnum%9;
18. char a[100];
19. string str_yushu="";
20. if(yushu!=0){
21. str_yushu=str_yushu+(char)(yushu+'0');}
22. number.erase(0,2);
23. number=str_yushu+number;
24. }
25. if(number.size()==0)
26. cout<<0<<endl;
27. else
28. {
29. if(number[0]=='9')
30. cout<<0<<endl;
31. else cout<<number[0]<<endl;
32. }
33. }
34. int main()
35. {
36. cin>>n;
37. for(int i=0;i<n;i++)
38. {
39. number.clear();
40. cin>>number;
41. print_result();
42. }
43. }




换成如下这种形式便可以遍历一遍字符串的方式求出结果,而且不用删串,上一次获得的余数作为十位上的数字与字符串的下一位组成一个二位数或者是一位数,不停的往下找,最后可以推得结果

#include <iostream>
#include<string>
#include<stdlib.h>
#include<bits/stdc++.h>
using namespace std;
#define MAXN 210
int data[MAXN];
string number;
int m;
int n;
int len;
char a[1000001];
void print_result()
{
    int m=0;
    for(int i=0;i<len;i++)
    {
        m=(m*10+number[i]-'0')%9;//模拟有余数除式
    }
    cout<<m<<endl;
}
int main()
{
   scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
       scanf("%s",a);
        number=a;
        len=number.size();
        print_result();
    }
}


猜你喜欢

转载自blog.csdn.net/memeda1141/article/details/80540227