-
ZOJ4009 And Another Data Structure Problem(线段树+循环节)
2020-06-16 01:30:14打表,发现这玩意有循环节,我怎么可能知道 对任意数x,x*x*x%99971在48次时出现循环节 于是,线段树多开一维,同时维护当前这个区间如果是第0到47次被立方时的答案 类似标记永久化(?)/树上前缀和的东西,也不...题目
数据范围如上,两种操作,一种区间立方和,一种区间求和对99971取模
思路来源
https://blog.csdn.net/qq_31759205/article/details/79520745
题解
思维新奇.jpg
打表,发现这玩意有循环节,我怎么可能知道对任意数x,x*x*x%99971在48次时出现循环节
于是,线段树多开一维,同时维护当前这个区间如果是第0到47次被立方时的答案
类似标记永久化(?)/树上前缀和的东西,也不需要下放标记,
每次修改的时候找到完整区间,区间+1次%48
每次查询的时候,树上前缀和求当前区间已经经历了多少次被立方,输出对应的和
代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define pb push_back #define rep(i,a,b) for(int i=(a);i<=(b);++i) const int N=1e5+10,mod=99971; int t,n,q,a[N],op,l,r; struct segtree{ int n; struct node{int l,r,add;ll v[49];}e[N<<2]; #define l(p) e[p].l #define r(p) e[p].r #define a(p) e[p].add #define v(p,i) e[p].v[i] void up(int p){rep(i,0,47){v(p,i)=(v(p<<1,(i+a(p<<1))%48)+v(p<<1|1,(i+a(p<<1|1))%48))%mod;}} ll cal(ll x){return x*x*x%mod;} void bld(int p,int l,int r){ a(p)=0; l(p)=l;r(p)=r; if(l==r){v(p,0)=a[l]%mod;rep(i,1,47)v(p,i)=cal(v(p,i-1));return;} int mid=l+r>>1; bld(p<<1,l,mid);bld(p<<1|1,mid+1,r); up(p); } void init(int _n){n=_n;bld(1,1,n);} void chg(int p,int ql,int qr){ if(ql<=l(p)&&r(p)<=qr){a(p)=(a(p)+1)%48;return;} int mid=l(p)+r(p)>>1; if(ql<=mid)chg(p<<1,ql,qr); if(qr>mid)chg(p<<1|1,ql,qr); up(p); } ll sum(int p,int ql,int qr,int x){ x=(x+a(p))%48; if(ql<=l(p)&&r(p)<=qr)return v(p,x); int mid=l(p)+r(p)>>1;ll res=0; if(ql<=mid)(res+=sum(p<<1,ql,qr,x))%=mod; if(qr>mid)(res+=sum(p<<1|1,ql,qr,x))%=mod; return res; } }seg; int main(){ scanf("%d",&t); while(t--){ scanf("%d%d",&n,&q); rep(i,1,n){ scanf("%d",&a[i]); } seg.init(n); rep(i,1,q){ scanf("%d%d%d",&op,&l,&r); if(op==1){ seg.chg(1,l,r); } else{ printf("%lld\n",seg.sum(1,l,r,0)); } } } return 0; }
-
【拓展KMP+最小循环节】旋转数字
2018-05-13 11:50:44之前打死也没想通为啥可以用拓展kmp做,怎么是首尾比较法?后来直接写个例子就知道了。。。。方法是这样的,比如说t=12312312312,那么我就把t重复一遍得到s:1231231231212312312312。惊奇的发现从s的任一位开始数n...大致思路:
这道题也是肝了很久的一道题。。
之前打死也没想通为啥可以用拓展kmp做,怎么是首尾比较法?后来直接写个例子就知道了。。。。
方法是这样的,比如说t=12312312312,那么我就把t重复一遍得到s:1231231231212312312312。惊奇的发现从s的任一位开始数n位,也就是t旋转所得的一种结果。
那么,当然extend[1]=n,后面的话,如果extend值为0说明第一位就不一样,那就直接比较第一位大小,如果extend值不为0的话说明前面是有几个数位是一样的,那就比较第一个不一样的数位即 t[1+extend[i]](注意数位从1开始)和s[i+extend[i]]啊!比如说这个例子中,第七位开始的子串是1231212312312312,extend[7]=5,就是说和原串t=12312312312的前五位撞了,那么就比较第六位啊!发现第六位原串是3子串是1,所以按这个情况旋转得到的是小于原数的数。
整体思路解决了。优化问题来了:由于一些旋转所得的数字可能有重复,为了去重,一般会想到用map来存出现的次数。这里其实也可以,不过数位一大就会超时和超内存(题目想这样卡你)。
所以这里有一个更好的更优的满分方法:用kmp的next数组求最小循环节!
先上结论:串长度n-next[n]=最小循环节长度len,如果n%len==0,说明这个串都是由最小循环节构成的。
来了解一下原理:
所以,针对这道题,如果我们找到原数字串中的最小循环节,如果n%len==0即真的只由最小循环节构成,那么也就是说原数字串旋转所得的数字(不重复)一共也就(最小循环节长度)那么多种!!(这个可以举例看看)。那么我就只需要在s串中找前len个结果拿来看就Ok了。
这里要强调一下,kmp和exkmp中都叫next数组,但含义上区别完全不同:
kmp是拿来匹配模式串的,就是拿来找子串匹配的,为了简化复杂度,设置了next数组。next数组的含义是next[i]表示只看原串1~i部分,其中,前头和末尾有相同的部分,其长度为next[i]。
exkmp是拿来头尾比较的,可以自身和自身比,也可以两个不同串来比。拿t的头和s的尾来比,看重复的部分有多少。首先需要getnext(),其中next[i]表示t和自身比,(t[i]~t的末尾)和t串重复了next[i]长度部分。(而extend和next原理含义是一样的。)然后getextend(),其中extend[i]表示t和s比,这个i是s的下标,表示(s[i]~s的末尾)和t串比较,重复了extend[i]长度的部分。
自己画了个图形象一点:
AC代码(getnext是exkmp的,getnext2是kmp的):
#include<iostream> #include<bits/stdc++.h> using namespace std; const int maxn=1e5+10; char t[maxn],s[maxn<<1]; int nextt[maxn]; int next2[maxn]; int extend[maxn<<1]; int n,m; //t和s的长度 int vis[maxn]; //防重复 void getnext() { nextt[1]=n; int a=0; for(int i=1;i<=n && t[i]==t[i+1];i++) a++; nextt[2]=a; int k=2,p,l; for(int i=3;i<=n;i++) { p=k+nextt[k]-1; l=nextt[i-k+1]; if(p-i>=l) nextt[i]=l; else { int j=p-i+1; if(j<0) j=0; while(i+j<=n && t[1+j]==t[i+j]) j++; nextt[i]=j; k=i; } } } void getnext2() { next2[1]=0; for(int i=2;i<=n;i++) { int j=next2[i-1]; while(t[j+1]!=t[i] && j>0) j=next2[j]; if(t[j+1]==t[i]) next2[i]=j+1; else next2[i]=0; } } void getextend() { int a=0; for(int i=1;t[i]==s[i];i++) a++; extend[1]=a; int k=1,p,l; for(int i=2;i<=m;i++) { p=k+nextt[k]-1; l=nextt[i-k+1]; if(p-i>=l) extend[i]=l; else { int j=p-i+1; if(j<0) j=0; while(i+j<=m && 1+j<=n && t[1+j]==s[i+j]) j++; extend[i]=j; k=i; } } } int main() { scanf("%s",t+1); n=strlen(t+1); m=n*2; strcpy(s+1,t+1); strcat(s+1,t+1); getnext(); getnext2(); int len=n-next2[n]; //这里通过最小循环节优化去重超级关键了! if(m%len!=0) len=n; getextend(); int x=0,y=1,z=0; //x是小于原数的个数。z是大于原数的个数。 for(int i=1;i<=len;i++) //只需要看前len个。 { if(extend[i]==n) continue; if(t[1+extend[i]]>s[i+extend[i]]) x++; else if(t[1+extend[i]]<s[i+extend[i]]) z++; } cout<<x<<" "<<y<<" "<<z; return 0; }
PS:这里必须要注意一个关于next数组定义的问题,如果写int next[maxn]是通不过devcpp的,因为next这个数组名容易歧义,编译报错,所以以后注意一下都写int nextt[maxn],这样!
-
第二章 第十七节 理解多重循环——巴老师
2020-04-12 10:21:15关键字: 循环嵌套、执行过程、打印九九表 ...这样的循环,计算机怎么执行?它能帮助我们解决什么样的问题?这节课,跟着学在屏幕上打印一串串星星的图案和九九表,你就明白了。 微课2-17理解多重循环 ...关键字:
循环嵌套、执行过程、打印九九表
本节介绍:
多重循环,就是循环套着循环。这样的循环,计算机怎么执行?它能帮助我们解决什么样的问题?这节课,跟着学在屏幕上打印一串串星星的图案和九九表,你就明白了。
微课2-17 理解多重循环
-
c语言基础语法二——循环控制条件语句(完节)
2016-12-09 12:27:55前面那篇博客介绍了c语言的...看懂循环,就是看懂是怎么运行的,运行的步骤是怎么的顺序,我下面的程序都会标记出来的; 2;懂得设计,懂得利用控制语句完成一些简单的功能,例如打乘法表,用*打三角形直接进入主题吧;前面那篇博客介绍了c语言的一些基本语法,那些可能不能 打出有意思的程序,但是学好这节,那就是很有成就的哦,并且也会激情你对c语言的兴趣的。但是这章还是比较麻烦的,我用我自认为很好的方法介绍这节;
第一篇c语言基础语法博客链接;
http://blog.csdn.net/zw1996/article/details/53314096这节的两个关键就是; 1;看懂循环,就是看懂是怎么运行的,运行的步骤是怎么的顺序,我下面的程序都会标记出来的; 2;懂得设计,懂得利用控制语句完成一些简单的功能,例如打乘法表,用*打三角形
直接进入主题吧;
ps;下面,
语句的意思就是表达式等有值的;并且后面不需要分号的;
代码块;就是很多c语句(由分号结束的)组成;这里先说一个小知识点; 就是if,。。。。等下面结束的所以关键词都是默认包含他自己的下一条语句,如果要这个关键词包含多个语句就要使用{ //将这些语句包含起来; //等下还是举个例子,这个在国二里面还是比较重要的; }
1;条件语句
//注意条件语句都是执行一次的,不是循环语句,是不是去循环的,执行完一次之后就没了;
缺else的if语句
if else
没有花括号的if else语句,
说明了,if默认包含语句只有一条;
说明else要紧接着if默认语句后(或者是其花括号后)
突然发现有的知识点我到现在为止就写了很多遍了,不过我在后面可能还会继续写,让仔细看的一次就记住这个知识点,这个方法应该不错,毕竟多看几次就熟悉了吗;if elseif else
来个嵌套的if elseif等等的组合吧;
有分层的;
无分层的;关于条件语句就到这了,
敲个代码吧;
题目;
y = x 当x<1时;
= 2*x-1 当1=< x < 10时
= 3*x - 11 当x>=10时;
用scanf输入x的值求出y的值;
题目应该看懂了吧,就是x在不同的范围内利用不同的表达式求出y;#include<stdio.h> int main() { int x,y; scanf("%d",&x);//输入x ; if(x<1){ y = x; printf("%d\n",y);//输出y; } else if(x >= 1 && x < 10){//注意这里用到了之前的逻辑运算符 ; y = 2*x-1;//这里用到了之前的算术运算符; printf("%d\n",y); } else{ y = 3*x-11; printf("%d\n",y); } }
尴尬;写了将近2个小时了;只写完条件语句,不说话了、、、太耗时间了;
2;开关语句;
在条件语句中的if elseif…….else就是实现多路选择的情况,但是在c语言中它特意提供了专门的switch开关语句来处理多路分之的情形;但是在实际应用中尽量还是选择if吧,因为switch有点小麻烦,怕出语法错误,等哈就介绍;
2.1;switch语句的一般格式;
switch(表达式)
{
case 常量表达式 1: 语句组1;break;
case 常量表达式 2: 语句组2;break;
case 常量表达式 3: 语句组3;break;
.
.
.
.
.
case 常量表达式n:语句组n;break;default:语句组n+1;
}
先介绍一下怎么实现多分支语句吧;
switch里面的表达式的值;
这程序就会跳到那个有相同值的case语句那里去,
——并且在顺序执行;则是执行相应的语句组,
——然后再可能遇到break,则跳出switch语句了,程序运行跳到switch花括号后面;继续执行其他语句;
——但是如果没有遇到break则会继续顺序执行case语句,知道遇到break或者执行到switch的花括号处,则跳出switch,跳到switch后的花括号处执行其他语句了;
但是若没有相同的case语句,则跳到default语句处,执行语句组n+1;break的作用 break的功能就是是程序控制退出到该结构的花括号之外,
语法需注意地方;
1;一般情况下还是在每条case语句后加上break;
2;注意cese后面接的表达式一定要是常量;(注意)
3;case后面是冒号:
4,default是表示其他情况,当没有case语句想匹配的时候就执行这个语句,注意他可以省略;练手编程题;
输入一个等级,将其转换成对应的一个百分制的成绩范围,具体转换规则如下:
A为90~100;
B为80~89;
C为70~79;
D为60~69;
E为0~59;直接利用switch语句做吧?
没有加break时;
没有加default时;
case也是默认一条语句,但是执行完后仍然是顺序执行,因此是否加花括号是一样的道理;switch就到这了,下面就是进入真正的主题循环语句了;吃早中饭去了。睡到10点多不解释;花了半个小时左右敲完 switch吧;
3;循环语句;
循环结构就是在给定的条件成立时,反复执行的某个程序段。
给定的条件称为循环条件,反复执行的程序段称为循环体;
c语言有三种循环流程控制语句;while语句,do-while语句,for语句;
他们的循环体可以是复合语句,也可以是单一语句;
同样与之前的if…等一样的默认包含一条语句,如果要包括多条,那么则要使用花括号括起来;
3.1;while语句;
while语句 的一般格式;
while(表达式){
循环体;//注意,多条则必须打花括号,因为while只默认包含一条语句;
}执行过程; 先计算表达式的值, 若表达式为真则进入while循环执行循环体;执行完后再次返回执行表达式; 再计算表达式,如果为真则继续执行循环体; 之后又返回计算表达式的值,若为真则又执行循环体,直达表达式的值为假(也就是0)时才不进入while循环,执行while循环后面的其他语句; 意思就是,只要表达式为真则不断进入while循环执行循环体,直达表达式的值为假才不执行循环体,执行while后面的其他语句,程序运行指针直接到结束花括号后面,
while语句的特点就是,先判断后执行;
因此若当表达式的初值为0时,则表示循环体将一次也不执行;
又强调一遍,若循环体包含一条以上的语句时,必须用{}花括号括起来;否则只默认while后的第一条为循环体,而其余的都是while以后的其他语句了;//**小程序;编写1到100的和;使用while语句编写;** #include<stdio.h> int main() { int i = 1;//i初始化为1;则sum先加i,之后i再自增; int sum = 0; //注意这里一定要记得初始化;因为后面直接使用的是sum=sum+i; //直接使用sum,若是没有赋初值的话,则程序会出现混乱,这个再第一篇博客里面说过, //c语言对于变量的使用一定要先赋值再使用;若是没有赋值直接使用则程序没有完成任务,因为初始值是随机的; while(i <= 100){//while的表达式;在这里就是控制循环的结束,当i大于100时就结束; sum += i;//累加; i++;//i自增,达到1到100的过程 } //当表达式的值为假后程序才会执行while以后的其他语句; printf("1+2+3+.......+100 = %d\n", sum);//输出和; return 0; } 这样的小程序最好自己可以敲一遍的;
/* 程序功能;输入int型变量n;计算从1的阶乘到n的阶乘之和; sum = 1! + 2! + ...... + n!;这就是从1的阶乘到n的阶乘之和;并将其输出; 因为阶乘数可能比较到20几的阶乘就不能再使用int存储了,因此我们的输入不能很大,否则将出现超出存储数据类型的情况; 如果你没有敲过单个n的阶乘;那么可以先敲出n的阶乘,再看看这个例子; */ #include<stdio.h> int main() { int n, t, tt, cj; int sum; scanf("%d",&n);//输入变量n; t = 1;//因为要从1的阶乘到n的阶乘;因此将t初始化为1; sum = 0;//这里是与之前例子同样的道理,计算和,并且要先赋值再使用,则赋值为0; while(t <= n){ tt = 1;//计算阶乘,阶乘是从1累乘到n因此将tt初始化为1; cj = 1;//这里与sum初始化一样,因为是累乘,因此要赋初始值为1; while(tt <= t){//这个while循环的作用就是计算t的阶乘; cj *= tt; tt++; } sum += cj;//进行累加; t++; } printf("计算从1的阶乘到n的阶乘和 = %d",sum); return 0; }
3.2;do-while循环语句;(这种循环语句相对使用得是比较少的,介绍完你就会感觉的,个人认为这个用得比较少,但是国二选择题还是比较喜欢出的;因此还是要掌握;)
do-while循环语句的一般格式;
do{
循环体;
}while(表达式);//**do-while语句的执行过程;** 首先先执行一遍循环体,然后到达while表达式, 再判断表达式的值,若为真则返回上面继续执行循环体;然后再计算表达式的值;若为真则继续返回执行循环体;直到表达式的值为假,才不返回执行循环体而是跳出do-while循环,执行下面的语句;
同样在这里仍然要注意do后面默认的循环体仍然是默认一条语句,因此要包含多条则要使用花括号,并且最好使用花括号;
其特点;
do-while语句,先是执行一遍循环体,然后在计算表达式的值,因此至少会执行一次循环体的;说明; 1;do-while语句由do开始,用while结束,并且while语句后面的分号不能缺少; 2;do-while语句和while语句都能实现循环控制的功能的,do-while结构的程序都可以转化为while结构程序,但 是while结构程序就不一定可以转化为do-while结构; 3;循环语句只能是一条,若是要使用多条则必须使用花括号;
//do-while和while; 1;两者都是只有将循环条件为真时才执行循环体; 2;do-while一定会执行一次循环体, 3;do-while是先执行循环体再判断; while是先判断再看是否执行循环体;
/* 程序目的;完成逆序输出; 输入一个整形数n,然后逆序输出来来 例如;输出n等于1234;则需输出4321; */ #include<stdio.h> int main() { int s, n; s = 0;//这个初始化为0,与之前一样;因为是累加,并且要先初始化再使用; scanf("%d",&n); do{ s = s*10+n%10; //这两个步骤看不懂可以在纸上模拟一遍; //注意这个是需要知道的,国二的时候是需要编写这两步的因此需要知道 n /= 10; }while(n);//判断条件,当n等于0时则跳出来; printf("其逆序数为 = %d\n",s); return 0; } /* 注意do-while编程可以不需要了解,但是需要看懂,知道程序是怎么运行的; 但是这个程序中的循环体一定需要知道的,因为这个经常使用到, 你可以使用while编写一下这个程序; */
3.3;for循环语句;(注意这个是最常使用的一种循环语句)其余两种循环结构都可以使用这种来完成
for语句是c语言所提供的功能更强,使用更广泛的一种循环语句;
for语句的一般格式;
for(表达式1;表达式2;表达式3){
循环体;//同样注意for语句默认包含一条语句;若是循环体是多条则必须使用花括号;
}
注意for循环等效为while结构就是;
表达式1;
while(表达式2){
循环体;
表达式3;
}
是不是也是刚刚好;先执行表示1;判断表达式2,再执行表达式3;再判断表达式2;。。。。。。。执行过程; 先执行表达式1;然后在判断表达式2;若为真则执行循环体; 循环体执行完后,则返回到执行表达式3;之后再判断表达式2;若为真则进行执行循环体,再执行表达式3再判断表达式2;知道表达式2为假的时候才结束for循环,执行for循环之后的其他语句; 因此可以看出表达式2;其实就是一个条件语句,判断是否再次进入循环执行循环体或者是跳出for循环;
注意;
1;for里面的循环体可以为空语句,则就是一个;什么都不管,或者不接东西也是正确的哦;刚测试了一下;
2;for语句里面的表达式可以省略,可以部分或者全部省略但是两个分号不能省略;for(;;)//这也是可以执行的;
3;for后面圆括号的中的表达式可以是任意有效的c语言表达式;
for(i=1,sum=0; i <= 10; sum+=i,i++);//后面直接一个分号表示空语句;不执行任何东西; 表达式1和表达式3都是逗号表达式;
/* 程序完成了;输入整数n,输出n的阶乘; */ #include<stdio.h> int main() { int i, n,jc; scanf("%d",&n); jc = 1;//同样只是一个初始化;因为是累乘则初始化为1; for(i = 1; i <= n; i++){//for表达式; jc *= i; } printf("n的阶乘为 = %d\n",jc); return 0; } 具体流程如下图;主要看程序执行的走向;我都标记的顺序号的;刚开始做循环语句的时候最好都是这样标记好顺序号,这样就不会出现错误了;
4;两个在循环控制中常见的关键字;continue和break;
这两个称为循环辅助手段;
一般来说,进入循环体以后在下次循环判断之前程序执行循环体中的所有语句;
但是continue和break语句是您可以根据循环体内进行的判断结果来忽略以后的循环体或者终止它;
4.1;continue;
该语句可以用于三种循环形式,当运行到该语句的时,它将导致剩余的循环体被忽略,不执行,直接跳到下个表达式(for则跳到表达式3,while,dowhile则跳到条件判断语句;)意思总的就是跳过这次循环剩余的循环体,开始下次循环; continue的功能是 中断循环体的本次执行(及跳过循环体中尚未执行的语句),立即开始执行下次循环, 注意; while和do-while循环的情况下,continue语句把程序控制转到表达式计算处,即判断是否开始下次循环; for循环中则是转至表达式3的计算,然后再判断表达式2,判断是否开始下次循环;
看事列;
对于这个应该有了了解吧,
/* 设计程序,输出从1到整数n的奇数和; 输入数n; 输出sum= 1+3+5+.....n(n为奇数时) =1+3+5+.....n-1(n为偶数时) */ #include<stdio.h> int main() { int sum, n, i; sum = 0;//与之前程序一样初始化,因为累加,则sum=0; scanf("%d",&n); for(i = 1; i <= n; i++){//从1遍历到n; if(i%2 == 0)//若为偶数则进入if条件语句; continue;//若执行continue则下面循环体不执行,直接跳到i++; sum += i; } printf("从1到n的奇数和为; %d\n",sum); return 0; }
4.2;break语句;
循环中break语句导致程序终止包含它的循环,并进行这个循环后面的其他语句;类似于条件不满足跳出循环一样,只是这里是,只要遇到break就跳出循环;意思就是,只要遇到break,就要跳出循环;
看事列;
注意一下,break除了用在循环之外,1;还用在switch开关语句中;这个之前说过; break的功能就是是程序控制退出到该结构的花括号之外, 2;用在循环的条件分支中,其功能是当做某个条件成立时,是程序控制从循环中退出,从而结束循环的过程,转而执行循环语句后的其他语句;
/* 设计一个程序,判断一个整数n是否是素数; 素数的概念;除开1和到本身之外不被其他任何数整除; 输入整数n; 输出ture,or false; 暂时先了解这种设计方法,还有很多好的方法; 思路; 根据素数的概念来; 从2到n-1循环一遍,如果都不能被n整除则n为素数; */ #include<stdio.h> int main() { int n,i; scanf("%d",&n); for(i = 2; i < n; i++){// 循环,从2到n-1; if(n%i == 0){//判断是否可以被n整除; break; } } //因为上面是如果存在不可被整除的那么则会跳出for循环, //那么则不是正常不满足for循环退出的, //则可以说明如果不是素数则不是正常退出,则i!=n; //若为素数则正常退出,则i=n的; if(i == n){ printf("ture\n"); } else{ printf("false\n"); } return 0; }
5;嵌套的循环以及continue和break的使用;
嵌套循环就是for里面嵌套while,for ,dowhile……..的;
while里面也可以嵌套fwhile,for ,dowhile……..语句;
这里都是可以的;5.1;利用嵌套循环来处理数据
/* 程序设计;利用嵌套循环,编写从1的阶乘到n的阶乘之和; 输入 ;整数n; 输出;sum,sum=1!+2!+......+n!; */ #include<stdio.h> int main() { int n, i, j, sum,jc; scanf("%d",&n); sum = 0;//初始化,因为累加则初始化为0; for(i = 1; i <= n; i++){//从1循环到n,达到从1到n的目的 jc = 1;//初始化,因为累乘则初始化为1;注意要放到里面,因为每次继续i的阶乘都要初始化1; for(j = 1; j <= i; j++){//从1循环到i;并且里面是累乘,达到计算i的阶乘的目的; jc *= j; } sum += jc;//将每次i的阶乘的和累加起来;最后的结果就是1到n的阶乘的和; } printf("从1的阶乘到n的阶乘和为;%d\n",sum); return 0; }
5.2;利用嵌套循环来直接输出的;
/* 设计程序;输出乘法表; 1*1=1 1*2=2 2*2 = 4; ........ ...... 等等; 输出利用嵌套循环直接输出的,而不是数据处理了 */ #include<stdio.h> int main() { int i, j; for(i = 1; i <= 9; i++){//从1依次循环到9;表示要循环9次; //在这里表示 要输出9行,第i次循环表示在第i一行里面要做什么 ;也就是循环体做的事情 //9行; for(j = 1; j <= i; j++){// 从1到i,表示循环i次,表示执行i次循环体,又因为里面是printf输出; //则在这里表示第i行输出i次,就是d第i行进行i次这个循环体; printf("%d*%d=%2d ",j, i, i*j); //注意这里是先输出j再i;因为第二个for中的j表示列数,i表示行数; //第i行输出i个乘法表达式 } printf("\n"); //可以看出i表示行数; //j表示列数; } //不知道这个注释看不看得懂;尴尬; return 0; }
6;应用;都是简单常见的编程题;最好独立完成;并且我也写出了思路;
6.1;打印n行的平行四边形; 例如输入3; *** ***** ******* 输出这个样子的; 思路; 这个输入嵌套循环里面的输入; 1。n行;则要最外层的循环是从1到n; 2。看每行里面做了什么,首先要打印空格个数是n-i个打印*,个数是2*i+1个,这个就要找规律的; 3;直接输出就ok了;关键再循环的初末和循环体;
6.2;输出100到1000的水仙花数; 水仙花数是;水仙花数是指一个3位数 ,它的每个位上的数字的 3次幂之和等于它本身。 (例如:153 = 1^3 + 5^3+ 3^3 = 153); 思路; 这个输出数据处理类的嵌套循环; 1;第一个循环肯定是从100循环到1000;(不包括1000);然后循环体要做什么呢? ————完成将数字的每位分开进行三次幂并且进行相加如果相等则应该输出这个数,否则进行下次循环 2;第一个循环循环体的编写 ——先完成将数字的每位分开;%10;/10%10;/100;这就分别得到每位的数(这个瓜分要知道的) ——然后在进行三次幂相加sum ——判断sum是否与这个数相等,如果相等则输出,否则进行下次循环;
6.3;打印菱形; 输入n; 输出 (当n=3;) * *** ***** *** * 这就是n=3时候的输出; 思路; 这是嵌套循环的输出; 这个与之前的平行四边形差不多;主要难点应该是不知道怎么控制输出;然后就独立编吧; 提示;先输出3行,再输出2行;分上下两部份就思路清晰一点;
6.4;记得我学循环就是去年圣诞之前,因此我也还用嵌套循环的输出打印圣诞树; 输入n; 输出(假设n=2;)表示上面有两个三角形;并且也表示树根的长宽; * *** * *** ***** *** *** ***
6.5;求输入的两个正整数a和b的最大公约数(即最大公因子)和最小公倍数; 可以利用辗转相除法; 即当b!=0时;r=a%b;a=b;b=r; 直到b=0时,a即为最大公约数; 最小公倍数;k/a;(k为刚开始a*b)
这5个列子的代码下次补上;
哈哈,基本上完成了,要断网了,刚刚好;
下篇博客可能要跳跃一下,先打结构体部分;因为要打数据结构的代码,因此这几天把结构体重新看了一下,因此趁热打铁,先把结构体打完再说,也就块期末了;该复习了,因此关于c语言基础的其他知识就寒假在补上了;
从7点敲到现在,中间和一个大四的学长聊了会天;总结出一句话就是
趁着现在大学时间多,多学点东西;现在的牛人太多了;
所以现在只能加油了,ok,睡觉了;下午没课,趁着中午睡觉之前的时间八上面代码的码一下吧;
6.1;
6.2;
6.3;
6.4;/* 程序设计;打印圣诞树; 输入n; 输出(假设n=2;)表示上面有两个三角形;并且也表示树根的长宽; * *** * *** ***** *** *** *** 其中n代表;树根上面有n个三角形;并且树根的长宽是2*n-1; 注意这里 这个与之前说的有点小的不同;下面都标有注释了; 具体思路; 1;先打印n个三角形;就是第一个循环从1到n;具体在里面实现输出三角形;第i次循环就打印第i个三角形; 2;在第一个循环所属的循环体里面打印三角形; 2.1;与之前打印的三角形一下,先考虑行数,从1循环到i+1, 这个循环体里面打印打印每行应该做什么, 使得这个循环完毕后输出一个三角形 、 3;打印完三角形之后;再另起循环输出树根; */ #include<stdio.h> int main() { int n, i, j, k; scanf("%d",&n);//输入的n代表是树根上面有n个三角形; for(i = 1; i <= n; i++){// 循环n次表示输出n个三角形; //在循环体里面输出三角形,达到每次循环就输出一个三角形; for(j = 1; j <= i+1; j++){//三角形的输出,还是回归到每行要输出什么,但这个循环结束就要打印一个完整的三角形; //在循环体里面,输出第i个三角形的第j行应该做什么; for(k = 1; k <= n-j+1; k++)//先打印空格 printf(" "); for(k = 1; k <= 2*j-1; k++)//打印*; printf("*"); printf("\n");//每行做的事,则应该输出换行; } } for(i = 1; i <= 2*n; i++){//输出树根,有2*n行; printf(" ");//打印一个空格,从第二列开始打印; for(j = 1; j <= 2*n-1; j++){//在每行输出2*n-1个*; printf("*"); } printf("\n"); } return 0; }
6.5; -
python打印九九乘法表到文件_99乘法表打印_python怎么打印九九乘法表
2021-01-12 03:56:06摘要 腾兴网为您分享:python怎么打印九九乘法表,掌上看家,学宝,相机美颜,天津广电等软件知识,以及小键盘,fceux,每日一占,试卷扫描仪,ceb转pdf,红警2共和国之辉补丁,映美312,教师节的贺卡图片,得力验钞机... -
python五角星符号怎么打出来_如何使用python输出连续星号?
2021-01-29 07:13:35小编依稀记得,自己初学编程时候,第一节课,老师就给我们演示了输出连续星号内容,那时候真感叹python的神奇,重温一遍这个内容,入门小伙伴们可以来看下啦~有关语法:用嵌套打印小星星需求在控制台连续输出五行 *... -
Python基础知识进阶(五---2)----程序基本结构、简单分支、异常处理、三大实例分析、基本循环结构、通用...
2017-09-30 03:17:00上一篇随笔写的内容有点多了,决定分成两节,不然自己看的时候也头疼。 三者最大实例: 分支结构可以改变程序的控制流,算法不再是单调的一步步顺序执行。 假设:以找出三个数字中最大者的程序设计为例。 ... -
python 语法基础 打印九九乘法表_打印九九乘法表 | python从入门到精通:入门篇之十八-阿里云开发者社区...
2020-12-03 14:01:50观察一下,这个九九乘法表是不是和上节课的“三角形”阵是一样的框架呢,把每个公式当成一个整体,那就是一个九行的“三角形”阵,图形的高度确定了,那么外层的循环也就确定了。现在来看内层的循环,也就是图形的... -
HDU 多校 Distinct Sub-palindromes 题解(打表or构造)
2020-07-21 21:56:31题目链接 题目大意 让你构造一个长为n的只包括小写字母的字符串,使得子字符串的回文串的个数最少(相同则算一个),求这样的字符串的...而如果是大于3,答案就是构造一个长度为3不同的循环节,来满足条件例如abcabc -
BZOJ4105 THUSC2015平方运算(线段树)
2018-11-08 01:48:00找题解打表可以发现循环节长度的lcm不超过60。 考虑怎么用线段树维护循环。对线段树上每个点维护这段区间的循环节、在循环中的位置,如果未进入环特殊记录;每次修改对于未进入环的暴力修改,已进入环的更新在... -
FZU - 1901 Period II (kmp)
2020-03-28 00:14:00题解:这个题是真的坑,一开始怎么都觉得自己不可能错,然后看了别人的博客打脸了,发现自己掉坑了了...一开始想的是找出最小循环节,只要每次输出多加一个循环节,最后输出len就好了。后来发现最小循环节的倍数并不... -
20171107校内模拟赛
2017-11-07 16:26:00T1本来写的矩阵快速幂,可是怎么也调不出来(初始矩阵建错),于是就去打了个找循环节的做法,自己手算了一下貌似循环节的长度大部分都很短,于是就去写了,但是被卡掉一个点。 T2打了个表,一下子发现是个等差... -
2020NOIP-B-字符串匹配(哈希,思维)
2020-12-15 19:54:09比较方便的做法,就是枚举ABABAB,这样可以在之后找循环节来解决,然后确定CCC,而接下来的问题就是我需要知道循环节。 于是正解用exKMPexKMPexKMP,于是…… 大炮打蚊子—xinjun 于是参照了字符串的题目,想到... -
考试总结----2017/10/20
2017-10-20 17:45:00主要是建图,建好图后DFS一遍找出当前环内的循环节,最后输出就好了。不到一会搞好了,心情简单。样例,过了。去测大数据,咦?怎么不对,心想不会啊,怎么可能不对???好好整理下思路,emmm........ -
【2020省选模拟】题解
2020-06-09 22:04:02zxytxdyzxytxdyzxytxdy!!!吊打全场!!! T1: 显然就是让你求多次%\%%不同数下的循环节fff 首先打表可以发现 ...然后考虑怎么求f(p)f(p)f(p)即可求得循环节 只考虑奇素数非平凡情况,另外的f(2)=3,f(5)=10f -
周中训练总结
2018-12-06 19:39:18最近在看kmp,kmp模板在很多题中就是变化一点,但是要看出怎么变化。...看到一个循环节问题,也是去青岛第一次打比赛的那一道类似的题,准备周末做一下。 顺便整理下星期天给18级同学讲课的课件。... -
codeforces456b
2016-10-31 20:36:34这个题吧,给n,求(1n次方+2n次方+3n次方+4n次方...然后yyyy又yy,想出来了,循环节,手写4个,发现4个一循环,判断数能mol几,然后打表一发就过了 (wrong了一发是因为字符串读入,10位没*10)#include #include<cs -
乒乓课2:0横扫小组
2006-10-29 14:47:03循环打...我以四个2:0扫了这一组!以小组第一出现!一下节课要和第八组的第二名打!!!(每一组前两个出现)不知道会怎么样!不过我想能小组出现的,再怎么也应该可以吧!不知道下一节课的对手怎么样!!!哈哈!大家祝好,下一节... -
noip2014 考试总结
2019-10-06 16:24:55noip:最初估分580,明间数据:570,初测估分:510-570,最终得分:570 这次noip怎么说呢,发挥的还是...rps:考试时没有看清数据范围,一下就把gcd,lcm求循环节什么的都打上了,一看范围n<=200就傻眼了。 link:... -
zr2019普专题No.1
2019-09-08 20:14:00\(\color{red}{A}\) 若删除长度为 x 的子串后序列中没有相同元素,那么一定有至少一个长度为 x+1 ...怎么还有个循环节啊23333 代码 : 木得 \(\color{yellow}{C}\) 先把所有物品按照拿走的时间从小到大排... -
笨办法学Python(三十二)
2019-10-06 05:17:10习题 32: 循环和列表 现在你应该有能力写更有趣的程序出来了。...这节习题中我们将使用for-loop(for 循环)来创建和打印出各种各样的列表。在做的过程中,你会逐渐明白它们是怎么回事。现在我不会告诉你,你需要... -
hdu 4611Balls Rearrangement
2017-04-11 20:58:38Balls Rearrangement ... 考虑分块处理 求lcm(A,B)循环节,因为a=10^5,爆了求lcm的贡献不好求,我们想想该怎么快速求得一个lcm块中的价值。如果你随便打个表或者画画图就会发现很多连续的段内是相同的 -
hdu4611Balls Rearrangement
2016-07-10 17:15:36分析:很显然我们会想到lcm(a,b)是循环节,因为a=10^5,爆了求lcm的贡献不好求,我们想想该怎么快速求得一个lcm块中的价值。如果你随便打个表或者画画图就会发现很多连续的段内是相同的值,那么 -
[SCOI2009]游戏(群论转数论,数论转分组背包)
2018-12-31 19:11:42题意:传送门 ...可以发现次数即为所有循环节的最小公倍数,那么问题就转化为了将n拆成若干个数求最小公倍数的方案,这又是个数论,之后就是想怎么才能做出这个题,首先唯一分解定理需要知道,之... -
JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)
2013-05-07 17:18:07基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 上架时间:2010-3-30 出版日期:2010 年3月 开本:16开 ... ...Java编程老鸟潜心写作,奉献高效率的Java学习心得 ...12.3.1 重温上节中的程序 349... -
Java入门1·2·3:一个老鸟的Java学习心得.PART2(共3个)
2013-05-07 17:19:14基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 上架时间:2010-3-30 出版日期:2010 年3月 开本:16开 ... ...Java编程老鸟潜心写作,奉献高效率的Java学习心得 ...12.3.1 重温上节中的程序 349... -
Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)
2013-05-07 17:20:12基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 上架时间:2010-3-30 出版日期:2010 年3月 开本:16开 ... ...Java编程老鸟潜心写作,奉献高效率的Java学习心得 ...12.3.1 重温上节中的程序 349...
-
基于正交试验设计的测试用例选择方法
-
PPT大神之路高清教程
-
提交本地代码到Git仓库并推送到码云
-
ReactNative从入门到原理
-
持续集成入门到精通:本地Maven的配置
-
「python」2020十大Python函式库有哪些?快来看看~(终)
-
基于电商业务的全链路数据中台落地方案(全渠道、全环节、全流程)
-
华为发布免费培养全栈大数据开发者
-
由热应力决定的高功率连续Nd:YAG激光器的最大泵浦功率
-
python字符串
-
Windows系统管理
-
产业数字金融的数字化与生态化
-
基于计算机视觉的无人驾驶感知系统
-
码头工人图像-源码
-
strade:strade是一个开源的股票扫描仪和筛选器-源码
-
磺酸水杨酸二钠晶体的非线性光学性质
-
在线课程-源码
-
DHCP 动态主机配置服务(在Linux环境下,配置单网段或跨网段提)
-
Amoeba 实现 MySQL 高可用、负载均衡和读写分离
-
培训解决方案:用于培训JAVA的存储库-源码