关于printf(C++)的奇怪问题
为什么在被强调的printf所在的这个for循环内加入任意一句printf(可输出也可不输出任何东西),才能得到正常的结论??而不加printf会得到奇奇怪怪的答案,而循环中所使用的plustree这个函数,如果没有那个printf就会出错
(原题非公开题目,所以不能展示,这个代码有部分数据是没通过的)
如果有大佬能帮我指出代码里面的的其他错误就更好了
以下是样例数据:
5 4
1 3 1 2 4
3 1 4 1
2 2 4
1 2 10
2 1 5
样例正确答案:
12
45
加入了这个printf的程序结果:

没加这个printf的程序结果:

(原题非公开题目,所以不能展示,这个代码有部分数据是没通过的)
如果有大佬能帮我指出代码里面的的其他错误就更好了

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
const int L=0,R=1;
struct Seg{
int l,r;
int son[2];
int plusm=0;
}c[400005];
int f[200005],s[200005],cnts=0;
int n,m,a[200005],cnt=1;;
void buildtree(int k,int l,int r){
//printf("k%d %d %d\n",k,l,r);
c[k].l=l;c[k].r=r;
if(l==r) return;
int mid=(l+r)/2;
cnt++;c[k].son[L]=cnt;
buildtree(c[k].son[L],l,mid);
cnt++;c[k].son[R]=cnt;
buildtree(c[k].son[R],mid+1,r);
return;
}
void addtree(int k,int l,int r,int v){
if(c[k].l==l&&c[k].r==r){
c[k].plusm+=v;
return;
}
int mid=(c[k].l+c[k].r)/2;
//printf("--%d %d %d %d\n",k,l,r,mid);
if(l<=mid) addtree(c[k].son[L],l,min(mid,r),v);
if(r>mid) addtree(c[k].son[R],max(mid+1,l),r,v);
}
int plustree1(int k,int j){
if(c[k].l==c[k].r){
printf("k=%d-plustree函数返回值 %d\n",k,c[k].plusm);//测试代码
return c[k].plusm;
}
int q;
int mid=(c[k].l+c[k].r)/2;
if(j<=mid) q+=plustree1(c[k].son[L],j);
else q+=plustree1(c[k].son[R],j);
printf("k=%d-plustree函数返回值 %d\n",k,c[k].plusm+q);//测试代码
return c[k].plusm+q;
}
int main(){
f[0]=f[1]=1;
for(int i=2;i<=200005;++i) f[i]=f[i-1]+f[i-2];
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
int root=1;
buildtree(root,1,n);
for(int ii=1;ii<=m;++ii){
int t;
scanf("%d",&t);
if(t==1){
int x,v;
scanf("%d%d",&x,&v);
a[x]=v-plustree1(1,x);
}
if(t==2){
int l,r,su=0;
scanf("%d%d",&l,&r);
int v=r-l;
int suj[205];//suj用于纪录su的变化
for(int i=0;i<=v;++i){
su+=(f[i]*(a[l+i]+plustree1(1,l+i)))%1000000000;
su%=1000000000;printf("");//就是这个printf<<<<<<<<<<<<<<<<<
suj[i]=su;
}
printf("suj数组用于纪录su的变化:\n");
for(int i=0;i<=v;++i){
printf("suj[%d]=%d\n",i,suj[i]);
}
cnts++;
s[cnts]=su;//printf("%d\n",su);
}
if(t==3){
int l2,r2,d;
scanf("%d%d%d",&l2,&r2,&d);
addtree(1,l2,r2,d);
}
}
for(int i=1;i<=cnts;++i){
if(i!=1) printf("\n");
printf("%d",s[i]);
}
return 0;
}以下是样例数据:
5 4
1 3 1 2 4
3 1 4 1
2 2 4
1 2 10
2 1 5
样例正确答案:
12
45
加入了这个printf的程序结果:

没加这个printf的程序结果:

...全文
相关推荐
你必须知道的495个C语言问题(PDF)
老资源。目录1 声明和初始化11.1 我如何决定使用那种整数类型? . . . . . . . . . . . . . . . . . . . 11.2 64 位机上的64 位类型是什么样的? . .
C语言理论判断题&选择题.docx
"C语言理论判断题&选择题"本文档总结了C语言考试题库,旨在帮助C初学者应对理论考试,涵盖了许多平常不怎么会注意到的奇奇怪怪的C用法,包括各种运算符的优先级等让人头疼的题目。
cpp代码-C和C++奇怪内容 ## # __VA_ARGS__和... (可变参数) 宽字符
\n"); // 等同于 printf("Hello, "); printf("world!
结合C语言缓冲区谈scanf()函数
scanf("%d", &a); scanf("%d", &b); scanf("%d", &c); printf("a=%d, b=%d, c=%d\n", a, b, c); system("pause
C语言精髓, 最奇怪的一题
#include <stdio.h> main() { int b = 3; int arr[]={6,7,8,9,10}; int *ptr=arr; *(ptr++)+=123; printf("%d,%d\n",*ptr,*(++ptr)); return 0; } 答案:8,8


