您的位置:首页 > 其它

uvaoj-1225:数数字

2016-02-12 14:47 190 查看
原题没找到。。

贴上链接:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=247&problem=3666&mosmsg=Submission+received+with+ID+16836885
题解:两种方法,第一种就是正常算就好啦,虽然时间复杂度不如第二种,但是也是能ac的,因为n的范围小,同时这种方法也很好理解,代码如下:

code:

#include <iostream>

#include <cstring>

using namespace std;

int cont[10]={0};

int main()

{

int t;

cin>>t;

int n;

while(t--)

{

cin>>n;

int mod;

int temp;

memset(cont,0,sizeof cont);

while(n--)

{

temp=n+1;

while(temp)

{

mod=temp%10;

cont[mod]++;

temp/=10;

}

}

cout<<cont[0];

for(int i=1; i<=9; i++)

cout<<' '<<cont[i];

cout<<endl;

}

return 0;

}

第二种方法就是打表先,这样时间复杂度会降低,效率上升,效率就是一切嘛。。让人脸红的是,没看博客之前我都没想到打表这件事。。Orz。。
code:

#include <iostream>

#include <cstring>

using namespace std;

// (1 < N < 10000) ;

int main()

{

int s[10][10005]={0};

int c;//替罪羊;
int mod;//余数;

for(int i=1; i<10005; i++)//注意要从1开始循环,访问数组以外的空间的话很有可能wa;

{

c=i;

while(c)

{

mod=c%10;

s[mod][i]++;

c/=10;

}

for(int j=0; j<10; j++)

s[j][i]+=s[j][i-1];

}

int n;

int t;

cin>>t;

while(t--)

{

cin>>n;

cout<<s[0]
;

for(int i=1; i<=9; i++)

cout<<' '<<s[i]
;

cout<<endl;

}

return 0;

}

笔记:lrj书上的题来做个二周目还是很有必要的,不愧是大神的书。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: