个人觉得OJ应该管控一下不当言论(这题还是很正常的,怎么就骂上了)。思路:按照输入的字符串每三个处理一次,最后结算是否满足4的倍数个输出,不满4的倍数个就输出“=”。附C代码:
#include <stdio.h> #include <string.h> int main() { int T, I; scanf("%d",&T); for(I=0; I<T; I++) { char s[100]; int i, n, cnt, ans[140]={0}, j;//将计算的结果存入ans数组中 scanf("%s",s); int l=strlen(s); for(i=0, cnt=0, j=0; i<l; i++) { if(cnt==0) //处理每三个字符中的第一个 { ans[j++]=s[i]/4; ans[j]=(s[i]%4)*16; } else if(cnt==1)//处理第二个 { ans[j++]+=s[i]/16; ans[j]=(s[i]%16)*4; } else//处理第三个 { ans[j++]+=s[i]/64; ans[j++]=s[i]%64; } cnt=(++cnt)%3;//注意这里要先自增再模3 } if(j%4) for(j++; j%4!=0; j++) ans[j]=64;//补齐4的倍数个输出 printf("case #%d:\n",I); for(i=0; i<j; i++)//处理输出 { if(ans[i]<26) printf("%c",'A'+ans[i]); else if(ans[i]<52) printf("%c",'a'+ans[i]-26); else if(ans[i]<62) printf("%c",'0'+ans[i]-52); else if(ans[i]==62) printf("+"); else if(ans[i]==63) printf("/"); else printf("="); } printf("\n"); } return 0; }
骂就不至于了吧……样例其实暗示你了要是4的倍数啊……debug也可以出来啊…… OJ题目不说清楚不是很正常的一件事吗………………
是,转换后字符数不是4的倍数就要输出=,凑满4的倍数(附AC代码) 不是不满4个字符
using namespace std; int T; string line; vector V;
void add(char aa) { for(int i=8;i>=1;i–) if(aa&(1<<(i-1))) V.push_back(1); else V.push_back(0); return; } char dic(int aa) { if(aa<=25) return ‘A’+aa; else if(aa<=51) return ‘a’+aa-26; else if(aa<=61) return ‘0’+aa-52; else if(aa==62) return ‘+’; else return ‘/’; } void print(int aa) { int num=0,weight=1; for(int i=5;i>=0;i–) { if(V[aa+i]) num+=weight; weight*=2; } printf(“%c”,dic(num)); return; } void solve() { cin>>line; V.clear();
int ll=line.length(); for(int i=0;i<ll;i++) add(line[i]); while(V.size()%6!=0) V.push_back(0);
int cnt=0; int pos=0; while(pos<V.size()) { print(pos); pos+=6; cnt++; } while(cnt%4!=0) {cout<<”=”;cnt++;} cout<<endl; return; }
int main() { scanf(“%d”,&T); for(int step=0;step<T;step++) { printf(“case #%d:\n”,step); solve(); } return 0; }
这题他妈的傻吊 日你妈
//AC代码 #include <iostream> #include <string> using namespace std; int main() { int i, j, k, n, Sample[6] = {32,16,8,4,2,1};//Sample保存转换成Base64码时对应数值 cin >> n; for (i = 0;i < n;i++) { int ascii[105 * 8] = {};//读取新字符串前刷新 string s; cin >> s; cout << "case #" << i << ":" << endl; for (j = 0;j < s.size();j++) { int m = int(s[j]); k = 7; while(m) { ascii[j*8+k] = m % 2; m = m / 2; k--; } } int BaseNum = s.size() * 8;//表示Base64码中位数 while (BaseNum % 6 != 0) { BaseNum++; }//使其成为6的倍数 for (j = 0;j < BaseNum / 6;j++) { int sum = 0;//记录Base64码值,每6位刷新一次 for (int q = 0;q < 6;q++)//每6位计算一次sum值 { sum += ascii[j * 6 + q] * Sample[q]; } if (sum <= 25 && sum >= 0) { cout << char(sum + 65); } else if (sum >= 26 && sum <= 51) { cout << char(sum + 71); } else if (sum >= 52 && sum <= 61) { cout << char(sum - 4); } else if (sum == 62) { cout << '+'; } else if (sum == 63) { cout << '/'; } } while (j % 4 != 0) { cout << '=';j++; }//不满4的倍数个字符时用'='补位 cout << endl; } }
个人觉得OJ应该管控一下不当言论(这题还是很正常的,怎么就骂上了)。思路:按照输入的字符串每三个处理一次,最后结算是否满足4的倍数个输出,不满4的倍数个就输出“=”。附C代码:
骂就不至于了吧……样例其实暗示你了要是4的倍数啊……debug也可以出来啊……
OJ题目不说清楚不是很正常的一件事吗………………
是,转换后字符数不是4的倍数就要输出=,凑满4的倍数(附AC代码)
不是不满4个字符
include
using namespace std;
int T;
string line;
vector V;
void add(char aa)
{
for(int i=8;i>=1;i–)
if(aa&(1<<(i-1))) V.push_back(1);
else V.push_back(0);
return;
}
char dic(int aa)
{
if(aa<=25) return ‘A’+aa;
else if(aa<=51) return ‘a’+aa-26;
else if(aa<=61) return ‘0’+aa-52;
else if(aa==62) return ‘+’;
else return ‘/’;
}
void print(int aa)
{
int num=0,weight=1;
for(int i=5;i>=0;i–)
{
if(V[aa+i]) num+=weight;
weight*=2;
}
printf(“%c”,dic(num));
return;
}
void solve()
{
cin>>line;
V.clear();
int ll=line.length();
for(int i=0;i<ll;i++) add(line[i]);
while(V.size()%6!=0) V.push_back(0);
int cnt=0;
int pos=0;
while(pos<V.size())
{
print(pos);
pos+=6;
cnt++;
}
while(cnt%4!=0) {cout<<”=”;cnt++;}
cout<<endl;
return;
}
int main()
{
scanf(“%d”,&T);
for(int step=0;step<T;step++)
{
printf(“case #%d:\n”,step);
solve();
}
return 0;
}
这题他妈的傻吊
日你妈