其他分享
首页 > 其他分享> > 1313:【例3.5】位数问题

1313:【例3.5】位数问题

作者:互联网

1313:【例3.5】位数问题


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 19897     通过数: 10897 

【题目描述】

在所有的N位数中,有多少个数中有偶数个数字3?,由于结果可能很大,你只需要输出这个答案对12345取余的值。

【输入】

读入一个数N(N≤1000)。

【输出】

输出有多少个数中有偶数个数字3。

【输入样例】

2

【输出样例】

73

编写程序:

#include<iostream>
#include<cmath>
using namespace std;
int main(){
  long long n,sum,b=0,c;
  cin>>n;
  if(n==1) b=9;
    else if(n>1){
      for(long long i=1*pow(10,n-1);i<1*pow(10,n);++i){
        c=i;
        sum=0;
        for(long long j=1;j<=n;++j){
          if(c%10==3) sum+=1;
          c/=10;
        }
            if(sum%2==0) b+=1;
        }
     }
  cout<<b%12345;
  return 0;
}

解题思路:以上程序对N位数的每一个数字进行统计,然后,判断N位数中有几个含偶数个3的数。这样做,由于N最大可以是1000,当一个数达到1000位非常非常大,循环查找的方法已经不可行了。数据太大即使是long long型数据也已经越界了。在DEV-C++中检验的时候,N=10左右,运行时间就很长了。

正确程序:

#include<iostream>
using namespace std;
int main(){
	long long n,a[1010]={0},b[1010]={0},c=9;
	cin>>n;
	a[1]=9;
	b[1]=1;
	for(int i=2;i<=n;++i){
		if(i==n) c=8;
		a[i]=(c*a[i-1]+b[i-1])%12345;
		b[i]=(a[i-1]+c*b[i-1])%12345;
    }
    cout<<a[n];
	return 0;
}

 

 

 解题思路:

(1)当N=1,1位数时,有(0,1,2,4,5,6,7,8,9)9个含偶数个3的数(含0个3,0也是偶数);只有(3)1个含奇数个3的数。

(2)当N=2,那么十位可以取的数字是(1,2,3,4,5,6,7,8,9)一个数的最高位不能取0.这样,十位可以取的数字中含偶数个3的数字有8个(1,2,4,5,6,7,8,9),含奇数个3的数字只有1个(3).所以,十位与个位组合:

 

 (3)当N=3至n时,组合如下图:

 

 (4)根据以上分析,由于数据特别巨大,因此,经过12345取余后,可以计算、编写程序。

 

标签:10,1313,数字,long,偶数,3.5,位数,1000
来源: https://www.cnblogs.com/xy2022/p/16272920.html