3.26(PTA)

目录

7-1 计算指数

7-2 计算摄氏温度

7-3 念数字

7-4 求阶乘累加和

7-5 6翻了

7-6 福到了

7-7 估值一亿的AI核心代码

7-8 前世档案

7-9 抢红包


7-1 计算指数

这道题就直接用pow()函数即可。

#include<stdio.h>
#include<math.h>
int main()
{
	int n;
	int s=1;
	scanf("%d", &n);
	s=pow(2, n);
	printf("2^%d = %d\n", n, s);
	return 0;
}

7-2 计算摄氏温度

这道题就是直接把100带入题目给出的公式即可。

#include<stdio.h>
int main()
{
    int c=0;
    c=5*(100-32)/9;
    printf("fahr = 100, celsius = %d", c);
    return 0;
}

7-3 念数字

这道题我一开始就是直接用if-else写的,不过速度比较慢,代码也比较繁琐。

#include<stdio.h>
#include<string.h>
int main()
{
    int l;
    char b[110];
    scanf("%s", b);
    l=strlen(b);
    for(int i=0;i<l;i++)
    {
        if(b[i]=='-')
            printf("fu");
        else
        {
            if(b[i]=='0')
                printf("ling");
            if(b[i]=='1')
                printf("yi");
            if(b[i]=='2')
                printf("er");
            if(b[i]=='3')
                printf("san");
            if(b[i]=='4')
                printf("si");
            if(b[i]=='5')
                printf("wu");
            if(b[i]=='6')
                printf("liu");
            if(b[i]=='7')
                printf("qi");
            if(b[i]=='8')
                printf("ba");
            if(b[i]=='9')
                printf("jiu");
        }
        if(i!=l-1)
            printf(" ");
    }
    printf("\n");
    return 0;
}

其实直接打表会更快更简洁。

#include<stdio.h>
#include<string.h>
char a[10][10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
int main()
{
    int l;
    char b[110];
    scanf("%s", b);
    l=strlen(b);
    for(int i=0;i<l;i++)
    {
        if(b[i]=='-')
            printf("fu");
        else
        {
            printf("%s", a[b[i]-'0']);
        }
        if(i!=l-1)
            printf(" ");
    }
    printf("\n");
    return 0;
}

7-4 求阶乘累加和

这道题我用的是前缀和的方法,即用两个数组,一个用来记录1-n的每个数的值,另一个用来记录其对应的阶层和的值。然后把后者进行求和就行。

#include<stdio.h>
int main()
{
    int n;
    scanf("%d", &n);
    int a[n];
    int b[n];
    long long s=0;
    for(int i=1;i<=n;i++)
    {
        a[i-1]=i;
        if(i==1)
            b[i-1]=a[i-1];
        else
        {
            b[i-1]=a[i-1]*b[i-2];
        }
        s+=b[i-1];
    }
    printf("%lld", s);
    return 0;
}

7-5 6翻了

这道题就是去判断连续的6或者9是否满足变化的条件,满足则改变输出,否则输出原字符串中的元素。

#include<stdio.h>
#include<string.h>
int main()
{
    char a[1010];
    gets(a);
    int l=strlen(a);
    for(int i=0;i<l;i++)
    {
        if(a[i]!='6'&&a[i]!='9')
            printf("%c", a[i]);
        else
        {
            int k6;
            int k9;
            if(a[i]=='6')
            {
                k6=1;
                for(int o=i+1;o<l;o++)
                {
                    if(a[o]!='6')
                        break;
                    else
                        k6++;
                }
                if(k6>3&&k6<=9)
                {
                    printf("9");
                    i=i+(k6-1);
                }
                else if(k6>9)
                {
                    printf("27");
                    i=i+(k6-1);
                }
                else if(k6<=3)
                {
                    for(int p=0;p<k6;p++)
                        printf("6");
                    i=i+(k6-1);
                }
            }
            if(a[i]=='9')
            {
                k9=1;
                for(int o=i+1;o<l;o++)
                {
                    if(a[o]!='9')
                        break;
                    else
                        k9++;
                }
                if(k9>3)
                {
                    printf("27");
                    i=i+(k9-1);
                }
                else if(k9<=3)
                {
                    for(int p=0;p<k9;p++)
                        printf("9");
                    i=i+(k9-1);
                }
            }
        }
    }
    printf("\n");
    return 0;
}

7-6 福到了

这道题我的想法就是开两个数组,一个用来存题目给出的原字符串,另一个用来存原数组倒置后的字符串,然后,判断遍历两数组看是否相同,相同则多输出一句"bu yong dao le",否则不输出此句。

#include<stdio.h>
#include<string.h>
int main()
{
    char c;
    int n;
    scanf("%c %d", &c, &n);
    char a[n][n];
    char b[n][n];
    getchar();
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%c", &a[i][j]);
            b[n-1-i][n-1-j]=a[i][j];
        }
        getchar();
    }
    int k=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(a[i][j]!=b[i][j])
            {
                k=1;
                break;
            }
        }
    }
    if(k==0)
        printf("bu yong dao le\n");
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(b[i][j]!=' ')
                printf("%c", c);
            else
                printf("%c", b[i][j]);
        }
        printf("\n");
    }
}

7-7 估值一亿的AI核心代码

这道题我没有ac,有一个示例没过,该示例应该是全为空格的情况,我尝试了好几种输出但还是没过的了T~T。。。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	scanf("%d", &n);
	getchar();
	for(int i=0;i<n;)
	{
		char a[1010];
		cin.getline(a, 1010);
		int l=strlen(a);
		printf("%s\n", a);
		printf("AI: ");
		for(;;)
		{
			if(a[0]==' ')
			{
				for(int j=0;j<l-1;j++)
				{
					a[j]=a[j+1];
				}
				l-=1;
				if(l==0)
					goto tiao;
			}
			else
				break;
		}
		for(int j=0;j<l;)
		{
			if(a[j]>='A'&&a[j]<='Z'&&a[j]!='I')
				a[j]+=32;
			if(a[j]==' ')
			{
				if((j+1>=l)||(j+1<l&&(a[j+1]==' '||a[j+1]=='?'||a[j+1]=='!'||a[j+1]==','||a[j+1]=='\'')))
				{
					for(int o=j;o<l-1;o++)
					{
						a[o]=a[o+1];
					}
					a[l-1]=' ';
					l-=1;
					continue;
				}
			}
			j++;
		}
		for(int j=0;j<l;)
		{
			if(a[j]=='?')
			{
				printf("!");
				j++;
				continue;
			}
			if(a[j]=='I')
			{
				if((j-1<0||((j-1>=0)&&
					(a[j-1]==' '||a[j-1]=='?'||a[j-1]=='!'||a[j-1]==','||a[j-1]=='\'')))&&
					(j+1>=l||((j+1<l)&&
						(a[j+1]==' '||a[j+1]=='?'||a[j+1]=='!'||a[j+1]==','||a[j+1]=='\''))))
				{
					printf("you");
					j++;
					continue;
				}
			}
			if(j+1<l&&a[j]=='m'&&a[j+1]=='e')
			{
				if((j-1<0||((j-1>=0)&&
					(a[j-1]==' '||a[j-1]=='?'||a[j-1]=='!'||a[j-1]==','||a[j-1]=='\'')))&&
					(j+2>=l||((j+2<l)&&
						(a[j+2]==' '||a[j+2]=='?'||a[j+2]=='!'||a[j+2]==','||a[j+2]=='\''))))
				{
					printf("you");
					j+=2;
					continue;
				}
			}
			if(j+6<l&&a[j]=='c'&&a[j+1]=='a'&&a[j+2]=='n'
				&&a[j+3]==' '&&a[j+4]=='y'&&a[j+5]=='o'&&a[j+6]=='u')
			{
				if((j-1<0||((j-1>=0)&&
					(a[j-1]==' '||a[j-1]=='?'||a[j-1]=='!'||a[j-1]==','||a[j-1]=='\'')))&&
					(j+7>=l||((j+7<l)&&
						(a[j+7]==' '||a[j+7]=='?'||a[j+7]=='!'||a[j+7]==','||a[j+7]=='\''))))
				{
					printf("I can");
					j+=7;
					continue;
				}
			}
			if(j+8<l&&a[j]=='c'&&a[j+1]=='o'&&a[j+2]=='u'&&a[j+3]=='l'&&a[j+4]=='d'
				&&a[j+5]==' '&&a[j+6]=='y'&&a[j+7]=='o'&&a[j+8]=='u')
			{
				if((j-1<0||((j-1>=0)&&
					(a[j-1]==' '||a[j-1]=='?'||a[j-1]=='!'||a[j-1]==','||a[j-1]=='\'')))&&
					(j+9>=l||((j+9<l)&&
						(a[j+9]==' '||a[j+9]=='?'||a[j+9]=='!'||a[j+9]==','||a[j+9]=='\''))))
				{
					printf("I could");
					j+=9;
					continue;
				}
			}
			printf("%c", a[j]);
			j++;
		}
		printf("\n");
		tiao:
			i++;
	}
	return 0;
}

7-8 前世档案

这道题我的思路就是去检索n在字符串中出现的位置。

由二叉树的性质,我们可以很容易的分析得出:每出现一个n,其对应编号就要增加n-1-j,其中n为此串字符串的长度,j为当前n所对应的下标。

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i=0;i<m;i++)
    {
        char a[n+1];
        scanf("%s", a);
        int k=1;
        int l=strlen(a);
        for(int j=0;j<n;j++)
        {
            if(a[j]=='n')
            {
                k+=pow(2, n-1-j);
            }
        }
        printf("%d\n", k);
    }
    return 0;
}

7-9 抢红包

这道题我的思路就是用一个结构体数组去存储每一个人所抢到的红包个数以及金额,还有就是其所支出的金额。在统计结束后,用其所得金额减去支出金额即为其所收入的金额,然后使用结构体排序,然后进行输出即可。

关于结构体排序可以看一下这篇:结构体的排序-CSDN博客

#include<stdio.h>
#include<algorithm>
using namespace std;
struct nuu
{
    int bianhao;
    long long qiangru=0;
    long long geshu=0;
    long long zhichu=0;
    long long qian;
};
int main()
{
    int n;
    scanf("%d", &n);
    nuu a[10100];
    for(int i=0;i<n;i++)
    {
        int k;
        scanf("%d", &k);
        a[i].bianhao=i+1;
        for(int j=0;j<k;j++)
        {
            int bianhao_i;
            long long jing_e;
            scanf("%d%lld", &bianhao_i, &jing_e);
            //printf("%d %d\n", bianhao_i, jing_e);
            //a[bianhao_i-1].bianhao=bianhao_i;
            a[bianhao_i-1].geshu++;
            a[bianhao_i-1].qiangru+=jing_e;
            a[i].zhichu+=jing_e;
        }
    }
    for(int i=0;i<n;i++)
    {
        a[i].qian=a[i].qiangru-a[i].zhichu;
    }
    sort(a, a+n, [](nuu ai, nuu bi){
        return ai.qian>bi.qian||(ai.qian==bi.qian&&(ai.geshu>bi.geshu||(ai.geshu==bi.geshu&&ai.bianhao<bi.bianhao)));
        
        });
    for(int i=0;i<n;i++)
    {
        printf("%d ", a[i].bianhao);
        if(a[i].qian<0)
        {
            a[i].qian=-a[i].qian;
            printf("-");
        }
        printf("%01lld.%.2lld\n", a[i].qian/100, a[i].qian%100);
    }
    return 0;
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值