【S1】1016.高精度除法

之所以写这一题是因为,同学普遍表示我的代码略短,而且我第二次看自己代码时也被自己震惊了= =||

核心思想并无不同

关键在于for循环与while的嵌套节省了大量的判断长度。

代码简洁的最主要因素是算法,逻辑复杂可能会增长代码长度。

此处我的逻辑是:

第一次比较时,若小于,直接break。

从第二次开始,用所选长度数字,用相同位数的数字做减法。

若所选的数字的前一位等于零,且不能再做减法,向下移位。

用tempint统计每一位的值,放入最终结果

(。??)ノ

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4
 5 int main(int argc, char *argv[]){
 6     string a, b, substring;
 7     int i, j, k;
 8     int tempint;
 9     int number = 0;
10     int size_a = 0, size_b = 0;
11     int result[300] = {0};
12     cin>>a>>b;
13
14     size_a = a.size();
15     size_b = b.size();
16   // 第一位开始,从高位到低位计算结果
17     for(i = 0; i <= size_a - size_b; ++i){
18         substring = a.substr(i, i + size_b);
19         // 统计每一位的值,number<=9
20         number = 0;
21         while(true){
22             if(i == 0 && substring < b) break; // 第一次的特殊情况
23             if(i != 0 && substring < b && a[i-1] == ‘0‘) break; // 第二次循环及以后的停止条件
24             for(j = i + size_b - 1, k = size_b - 1; j >= i; --j, --k){
25                 tempint = a[j] - b[k];
26                 if(tempint < 0) {
27                     a[j - 1] -= 1;
28                     tempint += 10;
29                 }
30                 a[j] = tempint + ‘0‘;
31             }   // 上方for循环用于计算每一位
32             ++number;
33             substring = a.substr(i, i + size_b); // 刷新
34         }
35         result[i] = number;
36     }
37     if(result[0]!=0){
38         cout << result[0];
39     }
40     for(i = 1; i <= size_a - size_b; ++i){
41         // 输出
42         cout << result[i];
43     }
44     return 0;
45 }
时间: 2024-10-28 15:39:07

【S1】1016.高精度除法的相关文章

1016. 高精度除法

Description 输入2个整数a和b,输出a/b . Input Format 输入有两行,第一行a,第二行b. 0≤a,b≤21000 . Output Format 输出只有一行,a/b . Sample Input 6 3 Sample Output 2 import java.util.Scanner;import java.math.BigInteger; public class Main{    public static void main(String args[]){ 

【算法学习笔记】34.高精度除法 SJTU OJ 1026/1016

高精度除法, 这个和加减乘一样,我们都要从手算的角度入手.举一个例子,比如 524134 除以 123.结果是4261 第一位4的来源是 我们把 524和123对齐,然后进行循环减法,循环了4次,余32,将32134的前三位321继续和123对齐,循环减法2次,余75,把7534的前三位753和123对齐,循环减法6次,余15,将154和123对齐,只能减1次,所以结果是4 2 6 1. 把上述过程程序化 1.把A,B两个数存入char数组 0下标表示的是最高位2.把A的前lenB位和B对齐进行

【算法:1】高精度除法

高精度除法,我用高精度减法来模拟 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> #include<string> using namespace std; inline int read() { int x=0,f=1;char ch=getchar();

中石油-高精度除法-java版

问题 G: [高精度]高精度数除以低精度数I 时间限制: 1 Sec  内存限制: 512 MB提交: 19  解决: 15[提交][状态][讨论版] 题目描述 修罗王聚集了庞大的暗元素以施展隐匿魔法,该魔法施展后将对其周边的时空产生隐匿效果,当然,隐匿的效果好坏取决于是否将暗元素平均地分配在其周边时空,显然这涉及高精度除法的编程.考虑到邪狼的理解能力,修罗王不得不先将问题简化为:输入一被除数(位数≤5000),输入一除数(整型数据范围内),输出整数商,忽略小数. 输入 共两行,第1行为一个数字

poj 2635 The Embarrassed Cryptographer 筛素数+高精度除法

题意: 给K(<10^100),L(<10^6),求K小于L的最小素因子并输出,如果没有则输出GOOD. 分析: 枚举小于L的素数用高精度除法判断是否是因子,关键是怎么高效筛素数,先给一种比较慢的筛法: primes[max_prime_num],num=0; memset(vis,0,sizeof(vis)) for(int i=2;i<maxL;++i) if(vis[i]==0){ prime[num++]=i; for(int j=2*i;j<maxL;j+=i) vis[

POJ 2325 Persistent Numbers#贪心+高精度除法

(- ̄▽ ̄)-* 这道题涉及高精度除法,模板如下: char s[1005]; char division[1005];//存储进行高精度除法的数据 bool bignum_div(int x) { int tot=0,num=0; for(int i=0;s[i];i++) { num=num*10+s[i]-'0'; division[tot++]=num/x+'0'; num%=x; } division[tot]='\0';//利于进行strcpy() if(num==0) //有适合的

使用java求高精度除法,要求保留N位小数

题目要求是高精度除法,要求保留N位小数(四舍五入),并且当整数部分为0时去除0的显示 1 import java.math.BigDecimal; 2 import java.util.Scanner; 3 4 public class BD 5 { 6 public static void main(String[] args) 7 { 8 Scanner scanner = new Scanner(System.in); 9 while(scanner.hasNext()) 10 { 11

高精度除法(大数相除)

高精度除法(高除高) #include<cmath> #include<iostream> #include<cstdio> #include<cstring> #include<string> using namespace std; int a[101],b[101],c[101],d,i; void shuru(int a[]) { string s; cin>>s; //读入字符串 a[0]=s.length(); //a[0

[结论][高精度除法]JZOJ 3771 小Z的烦恼

Description 小 Z 最近遇上了大麻烦,他的数学分析挂科了.于是他只好找数分老师求情. 善良的数分老师答应不挂他,但是要求小 Z 帮助他一起解决一个难题问题是这样的,现在有 n 个标号为 1-n 的球和 m 个盒子,每个球都可以放进且只能放进一个盒子里面,但是要满足如下的规则: 1.  若把标号为 i 的球放进了第 j 个盒子,那么标号为 2*i 的球一定要在第 j+1 个盒子里面(若 j<m) 2.  若把标号为 i 的球放进了第 j 个盒子,并且 k*2=i,那么标号为 k 的球一