题目大意:中文
注释代码:
/*
* Problem ID : NPOJ 1065 喵星人吃土豆
* Author : Lirx.t.Una
* Language : C
* Run Time : 2
* Run Memory : 1092
*/
#include <stdio.h>
//k最大31位,int最高位为符号位
#define MAXN 31
typedef long long llg;
llg _3n[MAXN];//_3n[i]表示3^i
int
main() {
int t;//测例数
int iscn;
int k;//表示要计算第k大总重
int i;//计数变量
llg ans;
//思路就是先获得k的二进制表示,第i位为1就将3^i加入结果ans
*_3n = 1LL;
for ( i = 1; i < MAXN; i++ )//先对3^n进行打表
//由于k最大为int的最大值,因此只需要计算0 ~ 30位的值就行了
_3n[i] = 3LL * _3n[i - 1];
scanf("%d", &t);
iscn = 0;
while ( t-- ) {
ans = 0LL;
scanf("%d", &k);
i = 0;
while ( k ) {//逐个取二进制位
if ( k & 1 ) ans += _3n[i];
k >>= 1;
i++;
}
printf("Case #%d: %lld\n", ++iscn, ans);
}
return 0;
}
无注释代码:
#include <stdio.h>
#define MAXN 31
typedef long long llg;
llg _3n[MAXN];
int
main() {
int t;
int iscn;
int k;
int i;
llg ans;
*_3n = 1LL;
for ( i = 1; i < MAXN; i++ )
_3n[i] = 3LL * _3n[i - 1];
scanf("%d", &t);
iscn = 0;
while ( t-- ) {
ans = 0LL;
scanf("%d", &k);
i = 0;
while ( k ) {
if ( k & 1 ) ans += _3n[i];
k >>= 1;
i++;
}
printf("Case #%d: %lld\n", ++iscn, ans);
}
return 0;
}