讨论 / RQ上不给用long long么?
nearjenguess 2010-05-21 22:32:00
点我顶贴 收藏 删除
第1次提交(80分):

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

typedef long long arr[10];

long long f[10][10], g[10][10];

arr res;

void prp(void)

{

int i, j;

long long p = 1;

for (i=0; i<=9; i++) f[1][i] = 1;

for (i=1; i<=9; i++) g[1][i] = 1;

for (i=2; i<=9; i++) {

p *= 10;

for (j=0; j<=9; j++) {

f[i][j] = f[i - 1][j] * 10 + p;

if (j) g[i][j] = g[i - 1][j] * 10 + p; else g[i][j] = g[i - 1][j] * 10 + p - 1;

}

}

}

void xx1(long long v, arr a1)

{

int i, j, k;

long long p1;

for (i=0; i<=9; i++) a1[i] = 0;

if (!v) return;

char ss[10]; itoa(v, ss, 10);

int len = strlen(ss);

for (i=0; i<len; i++) {

p1 = 1;

for (j=i+1; j<len; j++) p1 *= 10;

for (j=48; j<ss[i]; j++)

if (i || j - 48) {

for (k=0; k<i; k++) a1[ss[k] - 48] += p1;

a1[j - 48] += p1;

for (k=0; k<=9; k++) a1[k] += f[len - 1 - i][k];

} else {

for (k=0; k<=9; k++) a1[k] += g[len - 1][k];

}

a1[ss[i] - 48]++;

}

}

void xxx(void)

{

long long a, b;

scanf("%lld%lld", &a, &b);

arr w1, w2;

xx1(a - 1, w1); xx1(b, w2);

for (int i=0; i<=9; i++) res[i] = w2[i] - w1[i];

}

void pri(void)

{

for (int i=0; i<=8; i++) printf("%lld ", res[i]);

printf("%lld\n", res[9]);

}

int main(void)

{

prp();

xxx();

pri();

return 0;

}

第2次提交(AC):

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

typedef unsigned int arr[10];

unsigned int f[10][10], g[10][10];

arr res;

void prp(void)

{

int i, j;

unsigned int p = 1;

for (i=0; i<=9; i++) f[1][i] = 1;

for (i=1; i<=9; i++) g[1][i] = 1;

for (i=2; i<=9; i++) {

p *= 10;

for (j=0; j<=9; j++) {

f[i][j] = f[i - 1][j] * 10 + p;

if (j) g[i][j] = g[i - 1][j] * 10 + p; else g[i][j] = g[i - 1][j] * 10 + p - 1;

}

}

}

void xx1(unsigned int v, arr a1)

{

int i, j, k;

unsigned int p1;

for (i=0; i<=9; i++) a1[i] = 0;

if (!v) return;

char ss[10]; itoa(v, ss, 10);

int len = strlen(ss);

for (i=0; i<len; i++) {

p1 = 1;

for (j=i+1; j<len; j++) p1 *= 10;

for (j=48; j<ss[i]; j++)

if (i || j - 48) {

for (k=0; k<i; k++) a1[ss[k] - 48] += p1;

a1[j - 48] += p1;

for (k=0; k<=9; k++) a1[k] += f[len - 1 - i][k];

} else {

for (k=0; k<=9; k++) a1[k] += g[len - 1][k];

}

a1[ss[i] - 48]++;

}

}

void xxx(void)

{

unsigned int a, b;

scanf("%u%u", &a, &b);

arr w1, w2;

xx1(a - 1, w1); xx1(b, w2);

for (int i=0; i<=9; i++) res[i] = w2[i] - w1[i];

}

void pri(void)

{

for (int i=0; i<=8; i++) printf("%u ", res[i]);

printf("%u\n", res[9]);

}

int main(void)

{

prp();

xxx();

pri();

return 0;

}

两者唯一不同的就是把long long换成了unsigned int。

在第一次提交的结果中,有一个数据应该是1 1(根据输出结果猜的),我的输出竟然有负数(然而,1 1在我的机器上测是对的)。

难道RQ上不给用long long?

#1 liuxk_初出茅庐@2010-05-21 22:32:00
回复 删除
呃,你把所有的printf里的:

lld改成 I64d试试。

查看更多回复
提交回复