C/C++仿高山每周一练(难度增加)
本帖最后由 陈尚涵 于 2022-10-6 13:48 编辑如果你问我为什么要做仿每周一练,
因为,一天,我突然想起来我鱼C有VIP
就看了看,结果发现了 高山 (没有好友,不能@) 的每周一练
还彳亍,就是难度太低了,刚学会语法的初学者就能做出来,能有 t1 的难度就不错了{:10_277:}
所以我给大家搞点更难的题目,难度大概t2-t4吧{:10_257:}
那么话不多说,上题!
题目:小X的加法
难度:t2-t3
题目描述:
小X是一个小学生,他学会了列加法竖式,但是像1+2或者11+22这种题已经屡见不鲜了,
准备尝试更大的数,但是这么一来,小X却不会做了,你可以用程序帮他做吗?
输入样例1:
1 2
输出样例1:
3
输入样例2:
105 285
输出样例2:
390
输入样例3:
12345678987654321753159 98765432123456789357951
输出样例3:
111111111111111111111110
注意:lz亲测C++的long long过不了样例3,样例3只有高精度能过
高精度:指用字符串或数组模拟超大数字计算
如果我说的有问题欢迎指出,同时也欢迎大家发表代码,如果代码运行成功,奖励2鱼币!
这个系列我随缘更新
有人吗{:10_277:} 有人吗?
#include<iostream>
#include<cstring>
using namespace std;
int a, b, c;
int a_len, b_len, c_len;
void in() {
string tempa, tempb;
cin>>tempa>>tempb;
a_len = tempa.length();
b_len = tempb.length();
for(int i=0; i<a_len; ++i) {
a = tempa - '0';
}
for(int i=0; i<b_len; ++i) {
b = tempb - '0';
}
}
void add() {
for(int i=0; i<max(a_len, b_len); ++i) {
c += (a + b);
c += c / 10;
c %= 10;
}
if(c) c_len = max(a_len, b_len) + 1;
else c_len = max(a_len, b_len);
}
void out() {
//cout<<c_len<<endl;
for(int i=c_len-1; i>=0; --i) {
cout<<c;
}
}
int main()
{
in();
add();
out();
return 0;
} #include <bits/stdc++.h>
using namespace std;
int l, la, lb;
string f, s;
char op;
short a, b, ans;
void read(string va, string vb){
memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(ans, 0, sizeof(ans));
la = va.size(); lb = vb.size(); l = la > lb ? la : lb;
for(int i = la - 1; i >= 0; i--) a = va - '0';
for(int i = lb - 1; i >= 0; i--) b = vb - '0';
}
void print(short x[]){
for(int i = l-1; i >= 0; i--) cout << x;
cout << endl;
}
void add(short x[], short y[]){
int c = 0;
for(int i = 0; i < l; i++){
ans = x + y + c;
c = ans / 10;
ans %= 10;
}
if(c){ans = c; l++;}
}
int main(){
ios::sync_with_stdio(0);
cin >> f >> s;
read(f, s);
add(a, b);
print(ans);
return 0;
} @高山
喂,是高山吗?这里有个人模仿你! #include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
using std::cin, std::cout, std::endl;
using boost::multiprecision::cpp_int;
int main() {
cpp_int a, b;
cin >> a >> b;
cout << a + b << endl;
return 0;
}
hveagle 发表于 2022-10-6 13:24
@高山
喂,是高山吗?这里有个人模仿你!
高山难度太低了,我们也可以合作啊{:10_282:} 之前学相关的内容的时候就考虑过这种方法,但是碍于时间没有实际尝试过,这回正好实验一下
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
typedef struct{
uint32_t* data;
uint8_t blocks;
}BigInteger;
void BigInteger_init(BigInteger* integer){
integer->blocks = 0;
integer->data = NULL;
}
void BigInteger_release(BigInteger* integer){
if(integer->data != NULL) free(integer->data);
BigInteger_init(integer);
}
void BigInteger_read(BigInteger* integer){
static char buffer;
BigInteger_release(integer);
scanf("%s", buffer);
int length = strlen(buffer);
integer->blocks = ceil(length / 9.0);
integer->data = (uint32_t*)malloc(sizeof(uint32_t) * integer->blocks);
for(int i = 0; length > 0; ++i){
int start = length - 9;
if(start < 0) start = 0;
sscanf(buffer + start, "%9u", integer->data + i);
length = start;
buffer = '\0';
}
}
void BigInteger_write(const BigInteger* integer){
for(int i = integer->blocks - 1; i >= 0; --i){
if(i != integer->blocks - 1) printf("%09u", integer->data);
else printf("%u", integer->data);
}
putchar('\n');
}
void BigInteger_add(const BigInteger* lhs, const BigInteger* rhs, BigInteger* result){
BigInteger_release(result);
int predict_blocks = (lhs->blocks > rhs->blocks ? lhs->blocks : rhs->blocks) + 1;
result->data = (uint32_t*)malloc(sizeof(uint32_t) * predict_blocks);
int carry = 0;
for(int i = 0; i < predict_blocks; ++i){
if(i < lhs->blocks && i < rhs->blocks){
result->data = carry + lhs->data + rhs->data;
}else if(i < lhs->blocks){
result->data = carry + lhs->data;
}else if(i < rhs->blocks){
result->data = carry + rhs->data;
}else{
if(carry){
result->data = carry;
result->blocks = predict_blocks;
}else{
result->blocks = predict_blocks - 1;
result->data = (uint32_t*)realloc(result->data, sizeof(uint32_t) * result->blocks);
}
break;
}
carry = result->data > 999999999u ? 1 : 0;
result->data = carry ? result->data - 1000000000u : result->data;
}
}
int main(){
BigInteger a, b, result;
BigInteger_init(&a);
BigInteger_init(&b);
BigInteger_init(&result);
BigInteger_read(&a);
BigInteger_read(&b);
BigInteger_add(&a, &b, &result);
BigInteger_write(&result);
BigInteger_release(&a);
BigInteger_release(&b);
BigInteger_release(&result);
return 0;
} 陈尚涵 发表于 2022-10-6 13:44
高山难度太低了,我们也可以合作啊
我也觉得 陈尚涵 发表于 2022-10-6 13:44
高山难度太低了,我们也可以合作啊
收到 高山 发表于 2022-10-6 19:56
收到
嗯 陈尚涵 发表于 2022-10-7 09:47
嗯
加好友 zhangjinxuan 发表于 2022-10-6 17:35
我也觉得
那我提高难度! 高山 发表于 2022-10-7 18:38
那我提高难度!
普及组三四题难度!这种难度要得不? zhangjinxuan 发表于 2022-10-7 18:39
普及组三四题难度!这种难度要得不?
下次我得发创意小程序
想那个彩虹猫、系统恶搞之类的 高山 发表于 2022-10-7 18:40
下次我得发创意小程序
想那个彩虹猫、系统恶搞之类的
有道理欸 我的算法不好,接下来的代码如果写的不是很好还请轻喷{:10_266:}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char a;
char b;
scanf("%s%s",a,b);
char res;
memset(res,0,sizeof(res)-1);
int i,j,k;
int flag=0;
i=strlen(a)-1;
j=strlen(b)-1;
for (int l=0;a!='\0';l++) a = a - '0';
for (int l=0;b!='\0';l++) b = b - '0';
for (k=sizeof(res)-2;i>=0 || j>=0 || k>=0;j--,i--,k--)
{
if ((i<0?0:a)+(j<0?0:b)+flag >= 10)
{
res = (i<0?0:a)+(j<0?0:b)-10+flag;
flag = 1;
}
else
{
res = (i<0?0:a)+(j<0?0:b)+flag;
flag = 0;
}
}
res = '\0';
for (int l=0;l<sizeof(res)-1;l++) res = res + '0';
if (res == '0') res = '\b';
printf("%s\n",res);
return 0;
} 人造人 发表于 2022-10-6 13:30
这个头文件我显示没有啊{:10_277:} 陈尚涵 发表于 2022-10-9 20:13
这个头文件我显示没有啊
C++的boost库
页:
[1]
2