多组输入EOF
截止到0就用&&n
截止到0/-1就用 if《<=0 break;
第四种也就是第四种,什么都不说,只管输入,甚至没告诉怎么结束的。(多见于字符串处理) 在数字中是未知的数量就用while(cin>>n)但是不是0
#include<iostream> #include<math.h> using namespace std; int main(){s int n; cin>>n; double q; q=sqrt(n); // cout.precision(1);//这个加上就是会四舍五入 1指的是小数点之前+之后的一共只有一个 //所以int 不会四舍五入 double也不会 但是这个precision 会自动的四舍五入小数点后n-1位数 printf("%.0f",q); return 0; }
printf("%.0f",q);== cout.precision(1);
学习了
归并排序
并查集
快速排序
二分查找
在堆中定义了一个数组
void fz() {
for (int i = 0; i < MAX; i++) {
shuzu[i] = i;
}
}
然后在主函数中跑一下就行了
#include<bits/stdc++.h> using namespace std; //我选择路径压缩法+合并+查找 (附上不用路径压缩的) int f[200000]; int n,m; int z,x,y; //构造压缩法1.找祖宗函数 int parent(int x) {//不停找爹,直到找到祖宗为止 if (f[x]==x) return x; else return f[x]=parent(f[x]);//这里是路径压缩,把递归过程中遇到的 } /*//同上可以用三目运算快速表示 int parent(int o) {//不停找爹,直到找到祖宗为止 return f[o]==o?o:f[o]=parent(f[o]);//这里是路径压缩,把递归过程中遇到的 //结点的祖宗结点也直接修改了。 }*/ //构造merge函数 开始打架 int merge(int x,int y){ int x_root=parent(x); int y_root=parent(y); if(x_root!=y_root){ f[x_root]=y_root; //这里就把y向x的祖宗靠近 return 1; } else return 0; } void find(int x,int y) { int x_root=parent(x); int y_root=parent(y); if (x_root==y_root) printf("Y\n"); else printf("N\n"); } int main(){ cin>>n>>m; //是n个不同的,在主函数里面写initialise给每个点指向他们自身 //是m组数据 //下面的for相当于上面的fz函数 for(int i=1;i<=n;i++){ f[i]=i; } for(int i=1;i<=m;i++){ cin>>z>>x>>y; if(z==1)//合并操作=打架! merge(x,y); else//执行的是find找祖宗的 find(x,y); } }
I题目 大数取余变形
https://vjudge.net/contest/362412#problem/I
#include<iostream> using namespace std; int T,N,M; //大数取余是取余数的意思 大叔对于小数的玉树 ans=((ans*10)+BigNum[i])%c; 这个前面*10之后机上每位的数字 //本题是给出 两个数a,b 并且n个b结合可以是 所以那个每个位的数字都一样了,然后求一共有几位 long long fun(){ long long r = 0,tim = 0; while(true){ r = (r*10 + M) % N; tim++; printf("r=%d\n",r); if(r == 0) break; } // printf("%d",r); return tim; } int main(){ cin>>T; int kase = 0; while(T--){ scanf("%d %d",&N,&M); long long res = fun(); printf("Case %d: %lld\n",++kase,res); } return 0; }
大数取余 原版
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int big(int BigNum[],int c,int length)
{
int ans=0;
for(int i=0;i< length;i++)
ans=((ans*10)+BigNum[i])%c;
return ans;
}
int main()
{
char s[1001];
int a[1001],b,leng;
while(scanf("%s %d",s,&b)!=EOF)
{
leng=strlen(s);
for(int i=0;i<leng;i++)
{
a[i]=s[i]-'0';
}
printf("%d\n",big(a,b,leng));//a%b
}
return 0;
}
i=2 i<=n 是n-1次数 i=1i<=n是n次 i=0,i<n是 n次数
二分法
位运算左移X2 右翼/2