64,444
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <algorithm>
using namespace std;
string s;
int a[128];//10^n模20123
int b[128];//n个全9中1,2出现总次数
int c[128];//低n位模20123
int main()
{
int i;
int r, t;
a[0] = 1;
b[0] = 0;
for ( i = 1; i < 128; i++ ) {
b[i] = ( 2 * i * a[i - 1] ) % 20123;
a[i] = ( a[i - 1] * 10 ) % 20123;
}
while ( cin >> s ) {
s += '#';
reverse( s.begin(), s.end() );
c[0] = 1;
for ( i = 1; i < s.length(); i++ ) {
s[i] -= '0';
c[i] = ( s[i] * a[i - 1] + c[i - 1] ) % 20123;
}
r = 0;
for ( i = s.length() - 1; i >= 1; i-- ) {
r = ( r + s[i] * b[i - 1] ) % 20123;
if ( s[i] == 1 ) {
r = ( r + c[i - 1] ) % 20123;
}
else if ( s[i] == 2 ) {
r = ( r + c[i - 1] + a[i - 1] ) % 20123;
}
else if ( s[i] > 2 ) {
r = ( r + 2 * a[i - 1] ) % 20123;
}
}
cout << r << endl;
}
return 0;
}
题目还是很麻烦的,还要考虑开头是1或者2的情况,本来以为一个简单的递归就ok的
[quote=引用 6 楼 namelij 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] 仅供参考#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) { scanf("%d",&n); for (j=0;j<n;j++) { scanf("%s%s",a1,a2); L=strlen(a1); for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0'; L=strlen(a2); for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0'; for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i]; for (i=0;i<MAXLEN;i++) { if (v3[i]>=10) { v3[i+1]+=v3[i]/10; v3[i]=v3[i]%10; } } printf("Case %d:\n", j+1); printf("%s + %s = ", a1, a2); z=0; for (i=MAXLEN-1;i>=0;i--) { if (z==0) { if (v3[i]!=0) { printf("%d",v3[i]); z=1; } } else { printf("%d",v3[i]); } } if (z==0) printf("0"); printf("\n"); } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110
#include <iostream>
#include <string>
using namespace std;
const int MOD = 20123;
int pow(int n, int exp)
{
if(exp == 0)
return 1;
int t = pow(n * n % MOD, exp / 2);
if(exp % 2 == 1)
t = t * n % MOD;
return t;
}
int pnm(int b, int e, int n)
{
return n * pow(b, e) % MOD;
}
void Add(int& r, int v)
{
r = (r + v) % MOD;
}
int judge(int digit)
{
switch(digit)
{
case 1:
case 2:
return 1;
default:
return 0;
}
}
int main()
{
string num;
int x[10];
x[0] = judge(0);
for(int i=1;i<10;i++)
x[i] = x[i-1] + judge(i);
while(cin>>num)
{
int cnt = 0;
int result = 0;
int len = num.size();
for(int i=0;i<len;i++)
{
int digit = num[i] - '0';
if(i < len-1)
Add(result, pnm(10, len-2-i, x[9]*digit*(len-1-i)));
if(digit > 0)
Add(result, pnm(10, len-1-i, x[digit-1]));
Add(result, pnm(10, len-1-i, cnt*digit));
cnt += judge(digit);
}
Add(result, cnt);
cout<<result<<endl;
}
return 0;
}
一帮人在瞎搞。找规律,找公式,参考《编程之美》
//题目描述:
// 给定正整数N,函数F(N)表示小于等于N的自然数中1和2的个数之和,例如:1,2,3,4,5,6,7,8,9,10序列中1和2的个数之和为3,因此F(10)=3。
// 输入N,求F(N)的值,1=<N<=10^100(10的100次方)若F(N)很大,则求F(N) mod 20123的值。
//输入:
// 输入包含多组测试数据,每组仅输入一个整数N。
//输出:
// 对于每组测试数据,输出小于等于N的自然数中1和2的个数之和,且对20123取模。
//样例输入:
// 10
// 11
//样例输出:
// 3
// 5
#include <stdio.h>
#include <string.h>
#define MAXLEN 102
char a0[MAXLEN];
int v0[MAXLEN];
int v1[MAXLEN];
int i,j,L,n;
void main(void) {
while (1) {
if (1!=scanf("%101s",a0)) break;
memset(v0,0,MAXLEN*sizeof(int));
L=strlen(a0);
for (i=0;i<L;i++) v0[i]=a0[L-1-i]-'0';
n=0;
memset(v1,0,MAXLEN*sizeof(int));
while (1) {
for (i=0;i<L;i++) if (v1[i]!=v0[i]) break;
for (j=0;j<L;j++) if (v1[j]==1 || v1[j]==2) {n++;n=n%20123;}
if (i>=L) break;
v1[0]++;
for (i=0;i<L;i++) {
if (v1[i]>=10) {
v1[i+1]+=v1[i]/10;
v1[i]=v1[i]%10;
}
}
}
printf("%d\n",n);
}
}
[quote=引用 2 楼 zhao4zhong1 的回复:] 仅供参考#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) { scanf("%d",&n); for (j=0;j<n;j++) { scanf("%s%s",a1,a2); L=strlen(a1); for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0'; L=strlen(a2); for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0'; for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i]; for (i=0;i<MAXLEN;i++) { if (v3[i]>=10) { v3[i+1]+=v3[i]/10; v3[i]=v3[i]%10; } } printf("Case %d:\n", j+1); printf("%s + %s = ", a1, a2); z=0; for (i=MAXLEN-1;i>=0;i--) { if (z==0) { if (v3[i]!=0) { printf("%d",v3[i]); z=1; } } else { printf("%d",v3[i]); } } if (z==0) printf("0"); printf("\n"); } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110
仅供参考#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) { scanf("%d",&n); for (j=0;j<n;j++) { scanf("%s%s",a1,a2); L=strlen(a1); for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0'; L=strlen(a2); for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0'; for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i]; for (i=0;i<MAXLEN;i++) { if (v3[i]>=10) { v3[i+1]+=v3[i]/10; v3[i]=v3[i]%10; } } printf("Case %d:\n", j+1); printf("%s + %s = ", a1, a2); z=0; for (i=MAXLEN-1;i>=0;i--) { if (z==0) { if (v3[i]!=0) { printf("%d",v3[i]); z=1; } } else { printf("%d",v3[i]); } } if (z==0) printf("0"); printf("\n"); } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110
while(a)//以整数a为例
{
if(1==a%10)//取a最后一位与1比较
count++;//记录1的个数
a=a/10;//去掉a最后一位,若此时a不为0则继续循环。
}
希望对你有所帮助。。。#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char a1[MAXLEN];
char a2[MAXLEN];
static int v1[MAXLEN];
static int v2[MAXLEN];
static int v3[MAXLEN];
int i,j,n,L,z;
void main(void) {
scanf("%d",&n);
for (j=0;j<n;j++) {
scanf("%s%s",a1,a2);
L=strlen(a1);
for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';
L=strlen(a2);
for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';
for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];
for (i=0;i<MAXLEN;i++) {
if (v3[i]>=10) {
v3[i+1]+=v3[i]/10;
v3[i]=v3[i]%10;
}
}
printf("Case %d:\n", j+1);
printf("%s + %s = ", a1, a2);
z=0;
for (i=MAXLEN-1;i>=0;i--) {
if (z==0) {
if (v3[i]!=0) {
printf("%d",v3[i]);
z=1;
}
} else {
printf("%d",v3[i]);
}
}
if (z==0) printf("0");
printf("\n");
}
}
//Sample Input
//3
//0 0
//1 2
//112233445566778899 998877665544332211
//
//Sample Output
//Case 1:
//0 + 0 = 0
//Case 2:
//1 + 2 = 3
//Case 3:
//112233445566778899 + 998877665544332211 = 1111111111111111110