首页 > 试题广场 >

圆周率

[编程题]圆周率
  • 热度指数:2464 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
计算机大牛们都在拼算法,计算圆周率小数点后面的第n位。这涉及到许多除法,现在给你一个被除数和除数,请你计算小数点后n位的值。

输入描述:
输入包含多组数据。每组数据包含三个正整数:被除数a和除数b(1≤a<b≤100),以及精度n(1≤n≤1000)。


输出描述:
对应每组数据,输出a/b的结果,小数后面保留n位(不到n位的补零)。
示例1

输入

1 2 5<br/>2 3 3

输出

0.50000<br/>0.666
#include<stdio.h>
int main (){//the shorter,the better.
    int n,a,b;
    for(;~scanf("%d%d%d",&a,&b,&n);printf("\n"))
        for(printf("%d.",a/b);n>0;a=(a-a/b*b)*10,printf("%d",a/b),--n);
}

发表于 2018-01-28 17:27:58 回复(1)
精度高当然是用我们的竖式除法,余数*10借位,/值为当前位结果。
#include <stdio.h>
int main(){
    int a,b,n;  //模拟竖式除法
    int temp=0;
    while(scanf("%d %d %d",&a,&b,&n)!=EOF){
        printf("0.");   //默认a<b
        while(n--){
       a=a*10;     //借位
      temp=a/b;   //求值
       a=a%b;        //求余数
        printf("%d",temp);
        }
            printf("\n");
    }
    return 0;
}

发表于 2017-06-04 01:16:16 回复(0)
 int main(){ 
    printf("请输入a b以及小数位数,用空格隔开\n");
    while(1)
    {
         int a = 0,b = 0,c = 0;
         scanf("%d %d %d",&a,&b&,&c);
         printf(%.*f\n",c,(float)a/b);
    }
    return 0;
}

这里主要注意的是printf里面*可以表示小数点位数。

编辑于 2015-08-16 09:07:04 回复(1)
import java.math.BigDecimal;
import java.util.Scanner;

public class Main{
	
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		while(in.hasNext()){
			BigDecimal bd1=new BigDecimal(in.next());
			BigDecimal bd2=new BigDecimal(in.next());
			int n=in.nextInt();
		
			bd1=bd1.divide(bd2,n,BigDecimal.ROUND_FLOOR);
	
			System.out.println(bd1.toString());
		}
	}
}

发表于 2017-03-01 12:03:37 回复(0)


由于精度n的取值范围为 1≤n≤1000,所以老老实实算吧,别想偷懒。。。
模拟手动计算除法过程即可,补零上商求余

#include <iostream>
using namespace std;

int main() {
    int a = 0, b = 0, n = 0;
    //scanf返回值为正确输入数据的变量个数,当一个变量都没有成功获取数据时,此时返回-1
    while (scanf("%d %d %d", &a, &b, &n) != - 1) {
        string resStr = "";
        int tempNum = a / b;
        //获取整数位
        resStr.append(to_string(tempNum) + ".");
        a %= b;
        //依次求出小数点后的各个位值
        for (int i = 0; i < n; ++i) {
            if (a == 0) {
                //a == 0,说明能整除,后面补n - i个0
                resStr.append(n - i, '0');
                break;
            }
            //模拟小数除法,补零,上商,求余
            a *= 10;
            tempNum = a / b;
            resStr.append(1, tempNum + '0');
            a %= b;
        }
        printf("%s\n", resStr.c_str());
    }
    return 0;
}
————————————————
版权声明:本文为CSDN博主「hestyle」的原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://hestyle.blog.csdn.net/article/details/104700864
发表于 2020-03-06 17:55:57 回复(0)
package PAT;
import java.util.Scanner;
public class 圆周率 {
 public static void main(String[] args) {
  Scanner sc=new Scanner(System.in);
  while(sc.hasNext()) {
   int n=sc.nextInt();
   int m=sc.nextInt();
   int len=sc.nextInt();
   int ll=len;
   String str="";
   boolean f=true;
   if(n<m) {
    str+="0.";
    n*=10; f=false;
   }
   while(true) {  
    str+=n/m;
    n=n%m*10;
    if(f&&n<m) {
     f=false;
     str+=".";
    }  
    if(str.contains(".")) {
     len--;
    }
    if(n==0||len==0) break;    
       
   } 
   if(len!=0) {
    int dot=str.indexOf(".");
    int end=str.length()-1;
    int l=ll-(end-dot+1)+1;//System.out.println(dot+","+end+","+len+","+l);
    while(l!=0) {
     str+="0"; l--;
    }
   }  
   System.out.println(str);
  }
 }
}

发表于 2019-07-31 11:23:29 回复(0)
//1026.圆周率
#include <iostream>
#include <sstream>
#include <string> //string类不同于cstring(string.h)头文件
using namespace std;
/* 字符串与数字相互转换
1.stringstream类 #include<sstream>
字符串->整数
stringstream sstr(str);
int x;
sstr >> x;
整数->字符串
stringstream sstr;
int x;
sstr << x;
string str = sstr.str();
2.sprintf、sscanf函数 #include<cstdio>
sprintf(ctime,"%d:%d:%d",H,M,S);
sscanf(str,"%d",&i);
sscanf(str,"%f",&fp);
3.atoi,itoa函数 atof、atol、atoll #include<cstdlib>
int atoi(const char *nptr);
char *itoa(int value,char *string,int radix) radix是进制
*/
string divide(int a,int b,int n){
stringstream ss;
ss << a/b;
string z=ss.str();
int t=a%b;
string x;
while(n--){
if(t==0) x=x+'0'; //不到n位的补零
else x=x+(char)(t*10/b+'0');
t=t*10%b;
}
return z+'.'+x;
}
int main()
{
int a,b,n;
while(cin>>a>>b>>n){
cout << divide(a,b,n) << endl;
}
return 0;
}
编辑于 2019-02-12 17:58:08 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main()
{
    double a,b;
    int n;
    while(cin >> a >> b >> n)
    {
        cout << setiosflags(ios::fixed) << setprecision(n) << a/b << endl;
    }
    return 0;
}  //为啥我这个输入1 3 788会有bug
发表于 2018-11-22 22:22:02 回复(0)
思路 笔算的除法。
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

string Int2String(int n)
{
    stringstream ss;
    ss << n;
    string temp;
    ss >> temp;
    return temp;
}

string Remainder(int a_remainder, int b, int c)
{
    string answer;
    int remainder = 0;
    for (int i = 0; i < c; i++)
    {
        
        a_remainder = a_remainder * 10;
        remainder = a_remainder % b;
        answer += a_remainder / b + '0';
        a_remainder = remainder;
    }
    return answer;
}

int main()
{
    //Remainder(2, 3, 1000);
    
    int a, b, c;
    string answer;
    while (cin >> a >> b >> c)
    {
        answer = Int2String(a / b);
        answer += ".";
        if (a%b == 0)
        {
            for (int i = 0; i < c; i++)
            {
                answer += "0";
            }
            cout << answer << endl;
            answer = "";
            continue;
        }
        int remainder = a % b;
        answer += Remainder(remainder, b, c);
        cout << answer << endl;
        answer = "";
    }
    
    system("pause");
}

发表于 2018-08-13 10:01:02 回复(0)
import java.util.*;
import java.math.BigDecimal;
public class Main {
    public static void main(String[] args) {
        Scanner read = new Scanner(System.in);
        while(read.hasNextInt()) {
            int a = read.nextInt();
            int b = read.nextInt();
            int n = read.nextInt();
            BigDecimal aa = new BigDecimal(a);
            BigDecimal bb = new BigDecimal(b);
            System.out.println(aa.divide(bb, n, BigDecimal.ROUND_DOWN));
        }
    }
}

发表于 2018-04-03 14:14:38 回复(0)
#include <stdio.h>
int main()
{
    int a, b, n, res, i;
    while(scanf("%d %d %d", &a, &b, &n)!=EOF)
    {
        printf("0.");
        for(i=0; i<n; i++)
        {
            res = a*10/b;
            if(i!=n-1)
            {
                printf("%d", res);
            }
            else
            {
                printf("%d\n", res);
            }
            a = a*10 % b;
        }
        
    }
    return 0;
}
// python
while True:
    s = "0."
    try:
        a, b, n = list(map(int, input().split()))
        for i in range(n):
            s += str(a*10//b)
            a = a*10 % b
        print(s)
    except:
        break
// java
import java.util.Scanner;
public class Main {
        public static void main(String[] args){
                Scanner cin = new Scanner(System.in);
                int a, b, n;
                String answer;
                while(cin.hasNext()){
                        a = cin.nextInt();
                        b = cin.nextInt();
                        n = cin.nextInt();
                        answer = deliver (a,b,n);
                        System.out.println(answer);
                }
                cin.close();
        }
        private static String deliver(int a, int b, int n) {
                String answer = "";
                answer += a/b + ".";
                while(n>0){
                        answer += a*10 /b;
                        a = a*10 %b;
                        n--;
                }
                return answer;
        }       
}

编辑于 2017-12-06 19:49:56 回复(0)
#include <cstdio>
int main(){
    int a,b,n;
    while(scanf("%d%d%d",&a,&b,&n)==3){
        printf("0.");
        for(int i=0;i<n;i++){
            printf("%d",a*10/b);
            a=a*10%b;
        }
        printf("\n");
    }
    return 0;
}
简单的数学题
编辑于 2017-12-05 09:44:45 回复(0)
results=[]

while True: 
    try: 
        nums=[int(s) for s in input().split(' ')]
        sts='0.'
        tmp=nums[0]
        for i in range(nums[2]):
            sts+='%d' % (tmp*10/nums[1])
            tmp=tmp*10%nums[1]
        results.append(sts)
    except:
        break
for res in results:
            print (res)


发表于 2017-11-26 17:51:36 回复(0)
#include <stdio.h>
int main(){
	int a, b, n;
	while(scanf("%d %d %d", &a, &b, &n)!=EOF){
		printf("0.");
		for(int i=1;i<=n;i++){
			a = a * 10;
			printf("%d",a/b);
			a = a % b;
		}
		printf("\n");
	}
	return 0;
}

发表于 2017-07-23 23:09:07 回复(0)
#include<stdio.h>
int main()
{
	int a,b,i,n,cnt=0,flag=1;
	int s[1005];
	while(~scanf("%d%d%d",&a,&b,&n))
	{
		cnt=0;
		printf("%d.",(int)a/b);
		a=a%b;
		while(n--)
		{
			a=10*a;
			s[cnt++]=(int)(a/b);
			a=a%b;
		}
		for(i=0;i<cnt;i++)
			printf("%d",s[i]);
		printf("\n");
	}
	return 0;
}

发表于 2017-05-28 15:29:09 回复(0)
import java.util.Scanner;
public class Main {
        public static void main(String[] args){
                Scanner cin = new Scanner(System.in);
                int a, b, n;
                String answer;
                while(cin.hasNext()){
                        a = cin.nextInt();
                        b = cin.nextInt();
                        n = cin.nextInt();
                        answer = deliver (a,b,n);
                        System.out.println(answer);
                }
                cin.close();
        }
        private static String deliver(int a, int b, int n) {
                String answer = "";
                answer += a/b + ".";
                while(n>0){
                        answer += a*10 /b;
                        a = a*10 %b;
                        n--;
                }
                return answer;
        }        
}
//有一个弊端:
//因为用的是String而不是StringBuffer,因此要处理的数据量过大时,效率会降低。
//此时最好用StringBuffer来处理

编辑于 2017-04-29 00:03:09 回复(0)
#include<iostream>
#include<string>
using namespace std;
int main()
{
	int a, b, length;
	while (cin >> a >> b >> length)
	{
		string res;
		if (a / b < 10)
		{
			char ch = a / b + '0';
			res = res + ch;
			res = res + '.';
		}
		else
		{
			int c = a / b;
			while (c)
			{
				char ch = c % 10 + '0';
				res = ch + res;
			}
			res = res + '.';
		}
		a = a % b;
		for (int i = 0; i < length; i++)
		{
			char ch = a * 10 / b + '0';
			res += ch;
			a = a * 10 % b;
		}
		cout << res << endl;
	}
	return 0;
}

发表于 2017-04-22 20:53:41 回复(0)
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			int a = in.nextInt();
			int b = in.nextInt();
			int n = in.nextInt();
			System.out.print("0.");
			for(int i=0;i<n;i++){
				a*=10;
				System.out.printf("%d",a/b);
				a%=b;
			}
			System.out.println();
		}
	}
}
第一次提交提示超时,第二次又可以了。这
发表于 2016-09-05 20:33:45 回复(0)
#include<iostream>
#include<cstdio>

using namespace std;

int main(void)
{
    int a, b, n;

    while (cin>>a>>b>>n)
    {
        printf("0.");
        for (int i=0; i<n; i++)
        {
            a *= 10;
            printf("%d", a/b);
            a %= b;
        }
        printf("\n");
    }

    return 0;
} 


编辑于 2016-05-01 18:34:28 回复(0)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define N
/*
模拟竖式计算,遇到精度不够的就在后头补零继续除
*/
//typedef struct {
//
//} ;


int main(){
    int n,a,b;
 	while((scanf("%d%d%d",&a,&b,&n))!=EOF){
 	printf("%d",a/b);
 	if(n)printf("."); 
 	while(n--){
 		a=(a-a/b*b)*10;
 		printf("%d",a/b);
 		
	 }
 	printf("\n");

 };


return 0;
}


发表于 2016-01-22 22:21:58 回复(0)