目录
1.Scientific Notation
这道题目比较繁琐,第一道程序是我按着算法笔记的题解来写的。
其实需要注意几个点。
首先不要被这个结构吓到了,其实就是科学计数法的表达方式。
其次也不过是按照题目说的来输出,只是小数点和零的个数还有位置需要好好想一下。
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
int main(){
char str[10006];
scanf("%s",str);
if(str[0]=='-'){
printf("-");
}
int len=strlen(str),pos=0;//pos存放E的位置
while(str[pos]!='E'){
pos++;
}
int exp=0;//存放指数,不考虑正负
for(int i=pos+2;i<len;i++){
exp = exp * 10 + (str[i] -'0');
}
if(exp==0){
for(int i=1;i<pos;i++){
printf("%c",str[i]);
}
}
if(str[pos+1]=='-'){
printf("0.");
for(int i=0;i<exp-1;i++){
printf("0");
}
printf("%c",str[1]);
for(int i=3;i<pos;i++){
printf("%c",str[i]);
}
}else{
for(int i=1;i<pos;i++){
if(str[i]=='.') continue;
printf("%c",str[i]);
if(i==exp+2&&pos-1-2!=exp){
printf(".");
}
}
for(int i=0;i<exp-(pos-3);i++){
printf("0");
}
}
return 0;
}
这是我自己的解法,注释比较多,可能比较好理解
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
int main(){
char str[10008];
scanf("%s",str);
if(str[0]=='-') printf("-");//如果是负数,才需要输出负号
int len=strlen(str);
//找到E的位置
int pos_e;
for(int i=1;i<len;i++){
if(str[i]=='E'){
pos_e=i;
break;
}
}
//找到指数的大小
int exp=0;
for(int i=pos_e+2;i<len;i++){
exp = exp*10+(str[i]-'0');
}
//分为正指数和负指数来讨论
if(str[pos_e+1]=='-'){//负指数
printf("0.");//负指数一定是以0.开头的
for(int i=0;i<exp-1;i++){//根据负指数输出exp-1个零
printf("0");
}
printf("%c",str[1]);//输出科学计数法中的整数部分
for(int i=3;i<pos_e;i++){//输出科学计数法的小数部分
printf("%c",str[i]);
}
}else{//正指数
int dot = 2+exp;//原来小数点在数组的2号位,现在在2+exp处
int int_end = pos_e-1;//正好为整数时,最后面不需要小数点,所以要求出这个位置在后面进行判断
for(int i=1;i<pos_e;i++){
if(str[i]!='.') printf("%c",str[i]);
if(i==dot&&i!=int_end){
printf(".");
}
}
int nums = exp - (pos_e - 3);//如果指数比较大,需要补充的0的数目
for(int i=0;i<nums;i++){
printf("0");
}
}
return 0;
}
2.数字加密
有两个点无法通过
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
int main(){
char martix[15] = {'0','1','2','3','4','5','6','7','8','9','J','Q','K'};
char a[104],b[104];
char ans[104];
scanf("%s %s",a,b);
int len1=strlen(a);
int len2=strlen(b);
int length=0;
int x,y;
int i,j;
for(i=len1-1,j=len2-1;length<len1&&length<len2;length++,i--,j--){
x = a[i]-'0';
y = b[j]-'0';
if(length%2==0){
ans[length] = martix[(x+y)%13];
}else{
if(y-x<0) y+=10;
ans[length] = martix[y-x];
}
}
if(len1<len2){
for(length;length<len2;length++){
ans[length] = b[j--];
}
}else{
for(length;length<len1;length++){
ans[length] = a[i--];
}
}
length-=1;
for(length;length>=0;length--){
printf("%c",ans[length]);
}
return 0;
}
配套书里的做法:
首先可以把这两个字符数组翻转一下(这里并不会有进位),这样会比较方便。否则因为不知道长短而不好比较。
其次对于位数比较多的数组,可以把另一个数组缺少的位数看做0。
3.A+B Format
不能从后往前计数输出,这样会导致最后一段不对。
直接根据数组的坐标来,数组的坐标为3时,说明后面还有三个待输出,为6时也是这样。
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
int main(){
int x,y;
scanf("%d%d",&x,&y);
int ans=x+y;
if(ans<0){
printf("-");
ans*=-1;
}
int martix[10];
int num=0;
if(ans==0) martix[num++] = 0;//和为0时单独考虑
while(ans){
martix[num++] = ans%10;
ans/=10;
}
for(int k=num-1;k>=0;k--){
printf("%d",martix[k]);
if(k>0&&k%3==0) printf(",");
}
return 0;
}
4.Spell It Right
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
int main(){
char martix[12][6] = {"zero","one","two","three","four","five","six","seven","eight","nine"};
char str[105];
scanf("%s",str);
int sums=0;
for(int i=0;i<strlen(str);i++){
sums+=str[i]-'0';
}
int ans[100]={0},num=0;
if(sums==0) ans[num++] = 0;
while(sums){
ans[num++]=sums%10;
sums/=10;
}
for(int i=num-1;i>=0;i--){
printf("%s",martix[ans[i]]);
if(i!=0) printf(" ");
}
return 0;
}
5.Password
用结构体存储账号密码和是否修改过,再通过地址作为参数传入函数,使得可以在函数中对count和martix进行修改
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
struct node{
char name[12],password[12];
bool ischange=false;
}martix[1002];
void search(node& a,int& b){
int len=strlen(a.password);
for(int i=0;i<len;i++){
if(a.password[i]=='1'){
a.password[i]='@';
a.ischange=true;
}
if(a.password[i]=='0'){
a.password[i]='%';
a.ischange=true;
}
if(a.password[i]=='l'){
a.password[i]='L';
a.ischange=true;
}
if(a.password[i]=='O'){
a.password[i]='o';
a.ischange=true;
}
}
if(a.ischange){
b++;
}
}
int main(){
int n;
scanf("%d",&n);
int count=0;
for(int i=0;i<n;i++){
scanf("%s %s",&martix[i].name,&martix[i].password);
getchar();
search(martix[i],count);
}
if(count==0){
if(n==1){
printf("There is 1 account and no account is modified");
}else{
printf("There are %d accounts and no account is modified",n);
}
}else{
printf("%d\n",count);
for(int i=0;i<n;i++){
if(martix[i].ischange){
printf("%s %s\n",martix[i].name,martix[i].password);
}
}
}
return 0;
}
6.Kuchiguse
注意在给n赋值之后要用getchar();
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
char martix[102][258];
int length=-1;
int n;
void reverse(int n){
for(int i=0;i<n;i++){
int len = strlen(martix[i])-1;
if(len>length) length=len;
for(int j=0;j<len/2;j++){
char temp=martix[i][j];
martix[i][j] = martix[i][len-1-j];
martix[i][len-1-j] = temp;
}
}
}
bool issame(int q){
for(int i=0;i<n-1;i++){
if(martix[i][q]!=martix[i+1][q]){
return false;
}
}
return true;
}
int main(){
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++){
fgets(martix[i],258,stdin);
}
reverse(n);
int num=0;
char ans[258];
for(num;num<length;num++){
if(!issame(num)){
break;
}
}
if(num==0) printf("nai");
else{
for(int i=num-1;i>=0;i--){
printf("%c",martix[1][i]);
}
}
return 0;
}
7.Read Number in Chinese
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<set>
#include<queue>
#include<algorithm>
using namespace std;
char num[10][5] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
char wei[5][5] = {"Shi","Bai","Qian","Wan","Yi"};
int main(){
char str[5];
scanf("%s",str);
int len=strlen(str);
int left=0,right=len-1;
if(str[0]=='-'){
printf("Fu");
left++;
}
while(left+4<=right){
right-=4;
}
while(left<len){
bool flag=false;
bool isprint=false;
while(left<=right){
if(left>0&&str[left]=='0'){
flag=true;
}else{
if(flag==true){
printf(" ling");
flag=true;
}
if(left>0) printf(" ");
printf("%s",num[str[left]-'0']);
isprint=true;
if(left!=right){
printf(" %s",wei[right-left-1]);
}
}
left++;
}
if(isprint==true&&right!=len-1){
printf(" %s",wei[(len-1-right)/4+2]);
}
right+=4;
}
return 0;
}