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书上的题来做个二周目还是很有必要的,不愧是大神的书。。
贴上链接:
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书上的题来做个二周目还是很有必要的,不愧是大神的书。。
相关文章推荐
- 关于Windows7 64的注册表读写问题
- Building Maintainable Software-java篇之Write Simple Units of Code
- sdptool 设备服务查找命令使用
- 汇编软件MASM和调试工具DEBUG的使用
- java基础20递归
- POJ 2631 Roads in the North(树的直径)
- Volley学习记录(二)
- mongodb分片部署
- 解决ADB端口占用问题
- Soket转发消息服务(群聊)
- 那些被吹的神乎其乎的QQ营销大法
- jquery封装之--css封装
- POJ 1015
- hdoj 2055 An easy problem
- linux系统常用命令-整理
- 如何找到理想的另一半?
- Android相机开发那些坑
- android app两种调试方法
- 中介者模式——调停者
- 工作笔记-2014.4.3