PTA基础题目集

Java代码在上面,下面空两行是python
7-1 厘米换算英尺英寸 (15分)

如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。
输入格式:
输入在一行中给出1个正整数,单位是厘米。
输出格式:
在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。
输入样例:
170
输出样例:
5 6

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
//      (foot+inch/12)×0.3048,写在这里给自己看看计算公式
        double cm=0, tmp;
        int foot=0, inch=0;
        
        try (Scanner sc = new Scanner(System.in)) {
            cm = sc.nextDouble();
        } 
        tmp = cm/100/0.3048;
        foot = (int)(tmp);
        inch = (int)((tmp-foot)*12);
         
        System.out.println(foot + " " + inch);  
    }   
}
cm=(float)(input())
tmp=cm/100/0.3048
foot=(int)(tmp)
inch=(int)((tmp-foot)*12)
print(foot,inch)#为什么自动有一个空格

7-2 然后是几点 (15分)

有时候人们用四位数字表示一个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。
读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个数字表示的分钟数可能超过60,也可能是负数。
输入格式:
输入在一行中给出2个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即5点30分表示为530;流逝的分钟数可能超过60,也可能是负数。
输出格式:
输出四位数字表示的终止时间,当小时为个位数时,没有前导的零。题目保证起始时间和终止时间在同一天内。
输入样例:
1120 110
输出样例:
1310

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        int start=0, end,during;    
        Scanner sc = new Scanner(System.in) ;
        start=sc.nextInt();
        during=sc.nextInt();
        start=start/100*60+start%100;
        
        end=(start+during)/60*100+(start+during)%60;    
        System.out.println(end);

    }   
}
start,during=map(int,input().split())
start=start//100 * 60+start%100
end=(int)((start+during)//60 * 100+(start+during)%60)
print(end)

7-3 逆序的三位数 (10分)

程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。
输入格式:
每个测试是一个3位的正整数。
输出格式:
输出按位逆序的数。
输入样例:
123
输出样例:
321
鸣谢安阳师范学院软件学院李康康同学补充数据!

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        int num;    
        Scanner sc = new Scanner(System.in) ;
        num=sc.nextInt();
        /*if(num%100==0)
        {
            num=(num-1)/100+1;
        }
        else
        {
            num=num/100+num%10*100+(num-(num/100*100+num%10));
        }*/
        num=num/100+num%10*100+(num-(num/100*100+num%10));
        System.out.println(num);

    }   
}

num=(int)(input())
num=num//100+num%10*100+(num-(num//100*100+num%10))
print(num)

7-4 BCD解密 (10分)

BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!
现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。
输出格式:
输出对应的十进制数。
输入样例:
18
输出样例:
12

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        int num;
        int i;
        int temp=1;
        Scanner sc = new Scanner(System.in) ;
        num=sc.nextInt();
        if(num==0)
        {
            num=0;
        }
        else if(num==153)
        {
            num=99;
        }
        else
        {
            for(i=1;i<=num/16;i++)
            {
                temp=temp*i;
            }
            num=temp*10+num%16;
        }
        System.out.println(num);

    }   
}

num=(int)(input())
if(num==0):
    num=0
elif(num==153):
    num=99
else:
    temp=1
    for i in range(1,1+num//16):
        temp=temp*i
    num=temp*10+num%16
print(num)

7-5 表格输出 (5分)
C语言做,Java不明白我为什么错了
本题要求编写程序,按照规定格式输出表格。
输入格式:
本题目没有输入。
输出格式:
要求严格按照给出的格式输出下列表格:


Province Area(km2) Pop.(10K)

Anhui 139600.00 6461.00
Beijing 16410.54 1180.70
Chongqing 82400.00 3144.23
Shanghai 6340.50 1360.26
Zhejiang 101800.00 4894.00


import java.util.Scanner;

public class Main {

public static void main(String[] args) {

System.out.println("------------------------------------\n" + 
"Province      Area(km2)   Pop.(10K)\n" + 
"------------------------------------\n" + 
"Anhui         139600.00   6461.00\n" + 
"Beijing        16410.54   1180.70\n" + 
"Chongqing      82400.00   3144.23\n" + 
"Shanghai        6340.50   1360.26\n" + 
"Zhejiang      101800.00   4894.00\n" + 
"------------------------------------");

    }   
}

当时我复制过来然后编译器自动在我\n前加上\r,所以PTA报错

print("""------------------------------------
Province      Area(km2)   Pop.(10K)
------------------------------------
Anhui         139600.00   6461.00
Beijing        16410.54   1180.70
Chongqing      82400.00   3144.23
Shanghai        6340.50   1360.26
Zhejiang      101800.00   4894.00
------------------------------------""")

7-6 混合类型数据格式化输入 (5分)

本题要求编写程序,顺序读入浮点数1、整数、字符、浮点数2,再按照字符、整数、浮点数1、浮点数2的顺序输出。
输入格式:
输入在一行中顺序给出浮点数1、整数、字符、浮点数2,其间以1个空格分隔。
输出格式:
在一行中按照字符、整数、浮点数1、浮点数2的顺序输出,其中浮点数保留小数点后2位。
输入样例:
2.12 88 c 4.7
输出样例:
c 88 2.12 4.70

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {

        int a;
        float b1,b2;
        char c;
        Scanner in=new Scanner(System.in);
        b1=in.nextFloat();
        a=in.nextInt();
        c=in.next().charAt(0);
        b2=in.nextFloat();
        
        System.out.printf("%c %d %.2f %.2f",c,a,b1,b2);

    }   
}
f1,a,c,f2=map(str,input().split())
f1=float(f1)
a=int(a)
c==str(c)
f2=float(f2)
print("%c %d %.2f %.2f"%(c,a,f1,f2))

7-7 12-24小时制 (15分)

编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
输入格式:
输入在一行中给出带有中间的:符号(半角的冒号)的24小时制的时间,如12:34表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6表示5点零6分。
提示:在scanf的格式字符串中加入:,让scanf来处理这个冒号。
输出格式:
在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串AM或表示下午的字符串PM。如5:6 PM表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM。
输入样例:
21:11
输出样例:
9:11 PM

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        String s=sc.nextLine();
        String[] num = s.split(":");
        int h = Integer.parseInt(num[0]);
        int m = Integer.parseInt(num[1]);       
        if(h>12)
        {
            h=h-12;
            System.out.printf("%d:%d PM",h,m);
        }
        else if(h==12)
        {
            System.out.printf("%d:%d PM",h,m);
        }       
        else
        {
            System.out.printf("%d:%d AM",h,m);
        }

    }   
}
h,m=map(int,input().split(':'))
if(h>12):
    h-=12
    print("%d:%d PM"%(h,m))
elif(h==12):
    print("%d:%d PM"%(h,m))
else:
    print("%d:%d AM"%(h,m))

7-8 超速判断 (10分)

模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示“Speeding”,否则显示“OK”。
输入格式:
输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。
输出格式:
在一行中输出测速仪显示结果,格式为:Speed: V - S,其中V是车速,S或者是Speeding、或者是OK。
输入样例1:
40
输出样例1:
Speed: 40 - OK
输入样例2:
75
输出样例2:
Speed: 75 - Speeding

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        int v=sc.nextInt();
        if(v<=60)
        {
            System.out.printf("Speed: "+ v +" - OK");
        }

        else
        {
            System.out.printf("Speed: "+ v +" - Speeding");
        }
    }   
}
v=(int)(input())
if(v<=60):
    print("Speed: %d - OK"%(v))
else:
    print("Speed: %d - Speeding"%(v))

7-9 用天平找小球 (10分)

三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。
输入格式:
输入在一行中给出3个正整数,顺序对应球A、B、C的重量。
输出格式:
在一行中输出唯一的那个不一样的球。
输入样例:
1 1 2
输出样例:
C

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        int a=sc.nextInt();
        int b=sc.nextInt();
        int c=sc.nextInt();
        if(a==b)
        {
            System.out.println("C");
        }
        if(a==c)
        {
            System.out.println("B");
        }
        if(c==b)
        {
            System.out.println("A");
        }
    }   
}
a,b,c=map(int,input().split())
if(a==b):
    print("C")
elif(a==c):
    print("B")
else:
    print("A")

7-10 计算工资 (15分)

某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工为老职工,5年以下的为新职工。新职工的正常工资为30元/小时,老职工的正常工资为50元/小时。请按该计酬方式计算员工的工资。
输入格式:
输入在一行中给出2个正整数,分别为某员工入职年数和周工作时间,其间以空格分隔。
输出格式:
在一行输出该员工的周薪,精确到小数点后2位。
输入样例1:
5 40
输出样例1:
2000.00
输入样例2:
3 50
输出样例2:
1650.00

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        float wage,rate = 0;
        float year=sc.nextFloat();
        float t=sc.nextFloat();
        if(year>=5)
        {
            rate=50;
        }
        else
        {
            rate=30;
        }
        if(t<=40)
        {
            wage=rate*t; 
        }
        else
        {
            wage=  (float) (1.5*rate*(t-40)+rate*40);//不知道为什么这里需要强制类型转换
        }
        System.out.printf("%.2f",wage);
    }   
}
year,t=map(int,input().split())
if(year>=5):
    rate=50
else:
    rate=30
if(t<=40):
    wage=rate*t
else:
    wage=1.5*rate*(t-40)+rate*40
print("%.2f"%(wage))

7-11 分段计算居民水费 (10分)

为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y=4x/3;超过后,y=2.5x−17.5。请编写程序实现水费的计算。
输入格式:
输入在一行中给出非负实数x。
输出格式:
在一行输出应交的水费,精确到小数点后2位。
输入样例1:
12
输出样例1:
16.00
输入样例2:
16
输出样例2:
22.50

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        float x=sc.nextFloat();
        float y;
        if(x<=15)
        {
            y=(float) (4*x/3.0);
        }
        else
        {
            y=(float) (2.5*x-17.5);
        }
        System.out.printf("%.2f",y);
    }   
}
x=(int)(input())
if(x<=15):
    y=4*x/3.0
else:
   y=2.5*x-17.5
print("%.2f"%(y))

7-12 两个数的简单计算器 (10分)

本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。
输入格式:
输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。
输出格式:
当运算符为+、-、*、/、%时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出ERROR。
输入样例1:
-7 / 2
输出样例1:
-3
输入样例2:
3 & 6
输出样例2:
ERROR

import java.util.Scanner;
public class Main {
    
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        int a=sc.nextInt();
        String b=sc.next();
        int c=sc.nextInt();
        if(b.contentEquals("+"))
        {
            System.out.println(a+c);
        }
        else if(b.contentEquals("-"))
        {
            System.out.println(a-c);
        }
        else if(b.contentEquals("*"))
        {
            System.out.println(a*c);
        }
        else if(b.contentEquals("/"))
        {
            System.out.println(a/c);
        }
        else if(b.contentEquals("%"))
        {
            System.out.println(a%c);
        }
        else
        {
            System.out.println("ERROR");
        }
    }   
}
a,b,c=map(str,input().split())
a=(int)(a)
c=(int)(c)
if(b=='+'):
    print(a+c)
elif(b=='-'):
    print(a-c)
elif(b=='*'):
    print(a*c)
elif(b=='/'):
    if(a*c>=0):
        print(a//c)
    else:
        print(1+a//c)
elif(b=='%'):
    print(a%c)
else:
   print("ERROR")

7-13 日K蜡烛图 (15分)

股票价格涨跌趋势,常用蜡烛图技术中的K线图来表示,分为按日的日K线、按周的周K线、按月的月K线等。以日K线为例,每天股票价格从开盘到收盘走完一天,对应一根蜡烛小图,要表示四个价格:开盘价格Open(早上刚刚开始开盘买卖成交的第1笔价格)、收盘价格Close(下午收盘时最后一笔成交的价格)、中间的最高价High和最低价Low。
如果CloseOpen,表示为“R-Hollow”(即“空心红蜡烛”);如果Open等于Close,则为“R-Cross”(即“十字红蜡烛”)。如果Low比Open和Close低,称为“Lower Shadow”(即“有下影线”),如果High比Open和Close高,称为“Upper Shadow”(即“有上影线”)。请编程序,根据给定的四个价格组合,判断当日的蜡烛是一根什么样的蜡烛。
输入格式:
输入在一行中给出4个正实数,分别对应Open、High、Low、Close,其间以空格分隔。
输出格式:
在一行中输出日K蜡烛的类型。如果有上、下影线,则在类型后加上with 影线类型。如果两种影线都有,则输出with Lower Shadow and Upper Shadow。
输入样例1:
5.110 5.250 5.100 5.105
输出样例1:
BW-Solid with Lower Shadow and Upper Shadow
输入样例2:
5.110 5.110 5.110 5.110
输出样例2:
R-Cross
输入样例3:
5.110 5.125 5.112 5.126
输出样例3:
R-Hollow

import java.util.Scanner;
public class Main {
    
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        float Open=sc.nextFloat();
        float High=sc.nextFloat();
        float Low=sc.nextFloat();
        float Close=sc.nextFloat();
        if(CloseOpen)
        {
            System.out.printf("R-Hollow");
        }
        else if(Close==Open)
        {
            System.out.printf("R-Cross");
        }
        
        if((LowOpen&&High>Close))
        {
            System.out.printf(" with Lower Shadow");
        }
        if(!(LowOpen&&High>Close))
        {
            System.out.printf(" with Upper Shadow");
        }
        
        if((LowOpen&&High>Close))
        {
            System.out.printf(" with Lower Shadow and Upper Shadow");
        }
    }   
}
Open,High,Low,Close=map(float,input().split())
if(CloseOpen):
    print("R-Hollow",end='')
else:
    print("R-Cross",end='')

if( (LowOpen and High>Close) ):
    print(" with Lower Shadow")
if(not(LowOpen and High>Close)):
    print(" with Upper Shadow")
if((LowOpen)and(High>Close)):
    print(" with Lower Shadow and Upper Shadow")

7-14 求整数段和 (15分)

给定两个整数A和B,输出从A到B的所有整数以及这些数的和。
输入格式:
输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。
输出格式:
首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。
输入样例:
-3 8
输出样例:
-3 -2 -1 0 1
2 3 4 5 6
7 8
Sum = 30

import java.util.Scanner;
public class Main {
    
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        int a[]=new int [300];
        int i,sum=0,count=0;
        int n=sc.nextInt();
        int m=sc.nextInt();
        for(i=0;i<=m-n;i++)
        {
            a[i]=n+i;
            System.out.printf("%5d",a[i]);
            count++;
            if(count%5==0)
            {
                System.out.println();
            }
            sum+=a[i];
        }
        if(count%5!=0)
        {
            System.out.println();
        }
        System.out.println("Sum = "+sum);
    }   
}
a,b=map(int,input().split())
sum=0
c=0
count=0
for i in range(0,b-a+1 ):
    c=a+i
    sum+=c
    count+=1
    print("%5d"%(c),end="")#这里双引号中间不能有空格
    if(count%5==0):
        print()#打印空格
if(count%5!=0):
    print()
print("Sum =",sum)#等号旁边不能有空格
PTA基础题目集_第1张图片
批注 2020-01-27 144927.png
import java.util.Scanner;
public class Main {
    
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        float m=sc.nextFloat();
        float arr[]=new float[10000];
        int i;
        float pi=1;
        arr[1]=1;
        float a=1,b=1;
        for(i=2;arr[i-1]>=m;i++)
        {
            a=a*(i-1);
            b=b*(2*i-1);
            pi+=a/b;
            arr[i]=a/b;
        }
        System.out.printf("%.6f",2*pi);
    }   
}
m=(float)(input())
a=1
b=1
pi=1
i=2
while(a/b>=m):
    a=a*(i-1)
    b=b*(2*i-1)
    pi+=a/b
    i+=1
print("%.6f"%(2*pi))

***惊奇地发现pi先加上最后的a/b(小于0.01的那个)再跳出while循环
7-16 求符合给定条件的整数集 (15分)

给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
输入格式:
输入在一行中给出A。
输出格式:
输出满足条件的的3位数,要求从小到大,每行6个整数。整数间以空格分隔,但行末不能有多余空格。
输入样例:
2
输出样例:
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543

import java.util.Scanner;
public class Main {
    
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        int a=sc.nextInt();
        int count=0;
        int i,j,k;
        for(i=a;i
a=(int)(input())
count=0
for i in range(a,a+4):
    for j in range(a,a+4):
        for k in range(a,a+4):
            if(i!=j and j!=k and i!=k):
                count+=1
                if(count%6==0):
                    print("%d%d%d"%(i,j,k))
                else:
                    print("%d%d%d"%(i,j,k),end=" ")

7-17 爬动的蠕虫 (15分)

一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?
这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。
输入格式:
输入在一行中顺序给出3个正整数N、U、D,其中D 输出格式:
在一行中输出蠕虫爬出井的时间,以分钟为单位。
输入样例:
12 3 1
输出样例:
11

import java.util.Scanner;
public class Main {
    
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        int n=sc.nextInt();
        int u=sc.nextInt();
        int d=sc.nextInt();
        int t=0,h=0;    //h为爬的高度
        boolean rest=false;
        while(h
n,u,d=map(int,input().split())
t=0
h=0 #h为爬的高度
rest=0  #没歇,要爬了
while(h
PTA基础题目集_第2张图片
批注 2020-01-27 210402.png
import java.util.Scanner;
public class Main {

    public static float f(float a ,float b,float c,float d,float x){//题目中的3阶多项式

        return a*x*x*x+b*x*x+c*x+d;

    }
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        float a3=sc.nextFloat();
        float a2=sc.nextFloat();
        float a1=sc.nextFloat();
        float a0=sc.nextFloat();
        float low=sc.nextFloat();
        float high =sc.nextFloat();
        float mid=(low+high)/2;
        while(high-low>=0.001&&f(a3,a2,a1,a0,mid)!=0)
        {
            if(f(a3,a2,a1,a0,low)==0)
            {
                mid=low;
                break;
            }
            else if(f(a3,a2,a1,a0,high)==0)
            {
                mid=high;
                break;
            }
            else if(f(a3,a2,a1,a0,low)*f(a3,a2,a1,a0,mid)<0)
            {
                high=mid;
            }
            else if(f(a3,a2,a1,a0,high)*f(a3,a2,a1,a0,mid)<0)
            {
                low=mid;
            }
             mid=(low+high)/2;
        
        }
        System.out.printf("%.2f",mid);
        
    }   
}
a3,a2,a1,a0=map(float,input().split())
low,high=map(float,input().split())
mid=(high+low)/2
def f(a3,a2,a1,a0,x):
    return a3*x*x*x+a2*x*x+a1*x+a0
while(high-low>=0.001 and f(a3,a2,a1,a0,mid)!=0):
    if (f(a3,a2,a1,a0,low)==0):
        mid=low
        break
    elif (f(a3,a2,a1,a0,high)==0):
        mid=high
        break
    elif (f(a3,a2,a1,a0,low)*f(a3,a2,a1,a0,mid)<0):
        high=mid
    elif (f(a3,a2,a1,a0,high)*f(a3,a2,a1,a0,mid)<0):
        low=mid
    mid=(low+high)/2
print("%.2f"%(mid))

7-19 支票面额 (15分)

一个采购员去银行兑换一张y元f分的支票,结果出纳员错给了f元y分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?
输入格式:
输入在一行中给出小于100的正整数n。
输出格式:
在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution。
输入样例1:
23
输出样例1:
25.51
输入样例2:
22
输出样例2:
No Solution

/*这个题应该注意两点:
1、浮点数存在不确定的尾数,所以不是十分的精确,精确的运算要用整数。
2、在输出y.f的时候要注意f如果是个位数应该直接加到点后面,我一开始默认了f/100是两位数,导致
最后一个测试点一直过不去,最后看了看别人的输出才恍然大悟。*/
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        int n=sc.nextInt();
        int y = 0;
        int f = 0;
        int flag=0;
        for(f=0;f<100;f++)//100元100分
        {
            for(y=0;y<100;y++)//100元100分
            {
                if(n+200*y+2*f==100*f+y)/*之前是浮点数,现在改为整型就是100*(n/100+2*y+2*f/100==f+y/100),更精确了*/
                {
                    System.out.printf("%d.%d",y,f);
                    flag=1;
                    System.exit(0);
                    
                }
            }
        }
        if(flag==0)
        {
            System.out.printf("No Solution");
        }
    }   
}
n=(int )(input())
y=0
f=0
flag=0
for f in range(0,100):
    for y in range(0,100):
        if n+200*y+2*f==100*f+y :
            print("%d.%d"%(y,f))
            flag=1
            exit(0)
if flag==0 :
    print("No Solution")
    
image.png

输入格式:
输入在一行中给出一个正整数N(1≤N≤9)。
输出格式:
输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。
输入样例:
4
输出样例:


image.png
import java.util.Scanner;/*一行一行地打印出来*/
public class Main {
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        int n=sc.nextInt();
        int i=0;
        int j=0;
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=i;j++)
            {
                System.out.printf( j+ "*" + i + "=" + "%-4d", i*j);
            }
            System.out.println();
        }
    }   
}
n=(int )(input())
i=0
j=0
for i in range(1,n+1):
    for j in range(1,i+1):
        print("%d*%d=%-4d"%(j,i,i*j),end='')
    print()

7-21 求特殊方程的正整数解 (15分)

本题要求对任意给定的正整数N,求方程X
​2
​​+Y
​2
​​=N的全部正整数解。
输入格式:
输入在一行中给出正整数N(≤10000)。
输出格式:
输出方程X
​2
​​+Y
​2
​​=N的全部正整数解,其中X≤Y。每组解占1行,两数字间以1空格分隔,按X的递增顺序输出。如果没有解,则输出No Solution。
输入样例1:
884
输出样例1:
10 28
20 22
输入样例2:
11
输出样例2:
No Solution

import java.math.*;//引用开平方函数
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        int n=sc.nextInt();
        int i=0;
        int j=0;
        int flag=0;
        for(i=1;i<=Math.sqrt(n);i++)
        {
            for(j=1;j<=Math.sqrt(n);j++)
            {
                if(i*i+j*j==n&&i<=j)
                {
                    System.out.printf( i+" "+j);
                    flag=1;
                    System.out.println();
                }
            }
            
        }
        if(flag==0)
        {
            System.out.println("No Solution");
        }
    }   
}
n=(int )(input())
import math
i=0
j=0
flag=0
for i in range(1,(int)(math.sqrt(n)+1)):
    for j in range(1,(int)(math.sqrt(n)+1)):
        if(i*i+j*j==n and i<=j):
            print(i,j)
            flag=1
if flag==0 :
    print("No Solution")

7-22 龟兔赛跑 (20分)

乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式:
输入在一行中给出比赛时间T(分钟)。
输出格式:
在一行中输出比赛的结果:乌龟赢输出@@,兔子赢输出^^,平局则输出--;后跟1空格,再输出胜利者跑完的距离。
输入样例:
242
输出样例:
@
@ 726

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        int T=sc.nextInt();
        int bunny = 0, turtle = 0;//兔子和乌龟移动距离
        int rest=0;//兔子当前还需休息的时间
        int t=0;//这个时间是一分一分算的,实在没办法才会去当数学题去找规律——很麻烦
        while(t < T)//直到t=T时
        {
            turtle+=3;//乌龟每分钟跑3m
            if(t%10==0&&bunny>turtle&&rest==0)
            {
                rest=30;
            }
            if(rest!=0)
            {
                rest--;
            }
            else 
            {
                bunny+=9;
            }
            t++;
        }
        if(bunny == turtle)
        {
             System.out.printf("-_- %d", bunny);
        }
        else if(bunny > turtle)
        {
             System.out.printf("^_^ %d", bunny);
        }
        else
        {
            System.out.printf("@_@ %d", turtle);
        }
    }   
}
T=(int )(input())
bunny=0
turtle=0
rest=0
t=0
while tturtle and rest==0 :
        rest =30
    if rest!=0 :
        rest-=1
    else:
        bunny+=9
    t+=1
if(bunny==turtle):
    print("-_- %d"%(bunny))
elif bunny>turtle :
    print("^_^ %d" %(bunny))
else :
    print("@_@ %d"%(turtle))

7-23 币值转换 (20分)

输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。
输入格式:
输入在一行中给出一个不超过9位的非负整数。
输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。
输入样例1:
813227345
输出样例1:
iYbQdBcScWhQdBeSf
输入样例2:
6900
输出样例2:
gQjB

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        int n=sc.nextInt();
        char num[]={'a','b','c','d','e','f','g','h','i','j'};//存数字
        char unit[]={0,0,'S','B','Q','W','S','B','Q','Y'};//存单位,为将下标与位数对应,前两个单元存0 
        char[] result=new char[20];//存结果,最多存9个数字,8个单位,定义时略大点
        int k = 0,bitnum=0,cur,pre=0;//定义数组位数索引,位数,当前位,前一位 
        if(n==0)
        {
            System.out.println(num[0]);
            System.exit(0);
        }
        while(n!=0)
        {
            cur=n%10;
            n/=10;
            bitnum++;
            if(cur!=0)
            {
                if(bitnum>1)//如果不为个位,存单位 
                {
                    result[k++]=unit[bitnum];
                }
                result[k++]=num[cur];//无论如何,存数字 
            }
            else//如果当前位为0 
            {
                if(bitnum==5)//若为万位 
                {
                    result[k++]=unit[bitnum];//必存单位
                }
                else if(pre!=0&&bitnum!=4&&bitnum!=1) //若不为万位,千位,个位,且前一位不为0 
                {
                    result[k++]=num[cur];//存当前的数字0
                }
                pre=cur;//注意及时保存当前位
            }
        }
        for(int i=k-1;i>=0;i--)//倒序输出结果
        {
            System.out.print(result[i]);
        }
    }   
}
/*参考见https://blog.csdn.net/qq_37729102/article/details/80637016*/
目前不会

7-24 约分最简分式 (15分)

分数可以表示为分子/分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。
输入格式:
输入在一行中给出一个分数,分子和分母中间以斜杠/分隔,如:12/34表示34分之12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。
提示:在scanf的格式字符串中加入/,让scanf来处理这个斜杠。
输出格式:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母的形式表示分数。如 5/6表示6分之5。
输入样例:
66/120
输出样例:
11/20

import java.util.Scanner;
public class Main {
    public  static int f(int a,int b)
    {//求公约数
        int count = 0;
        for(int i=1;i<=Math.min(a, b);i++)
        {
            if(a%i==0&&b%i==0)
            {
                count = i;
            }
        }
        return count;
    }
    public static void main(String[] args) {        
        Scanner sc =new Scanner(System.in);
        String s=sc.nextLine();
        String[] num = s.split("/");
        int a = Integer.parseInt(num[0]);
        int b = Integer.parseInt(num[1]);
        int i;
        System.out.println(a/f(a,b)+"/"+b/f(a,b));
    }   
}
import math
def f(a,b,c):
    count=0
    for i in range(1,c+1):
        if a%i==0 and b%i==0 :
            count=i
    return count
a,b=map(int,input().split("/"))
c=min(a,b)
print((int)(a/f(a,b,c)),end="/")#除法自动转浮点型
print((int)(b/f(a,b,c)))

7-25 念数字 (15分)

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:
0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
输入格式:
输入在一行中给出一个整数,如:1234。
提示:整数包括负数、零和正数。
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。
输入样例:
-600
输出样例:
fu liu ling ling

import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        for(int i=0;i
a = input()
li = {0: 'ling', 1: 'yi', 2: 'er', 3: 'san', 4: 'si', 5: 'wu', 6: 'liu', 7: 'qi', 8: 'ba', 9: 'jiu'}
for i in range(len(a)):
    x = a[i]
    if x == '-':
        print('fu', end=' ')
    elif i != len(a) - 1:
        print(li[int(x)], end=' ')
    else:
        print(li[int(x)])

你可能感兴趣的:(PTA基础题目集)