??xml version="1.0" encoding="utf-8" standalone="yes"?>
java中没有指针,但是数组名,对象名都是其引用Q?br>指针q有帔R指针Q比如数l名
(2)new的区?br>java中的newq回对象的应?br>c++中的newq回其指针,
如果c++?br>SparseMatrix s=SparseMatrix(4,4,6,arrays);
如果java?br>SparseMatrix s=new SparseMatrix(4,4,6,arrays);
一、一个经q编译的C/C++的程序占用的内存分成以下几个部分Q?br>1、栈区(stackQ:q译器自动分配和释?nbsp;Q存攑և数的参数倹{局部变量的值等Q甚臛_数的调用q程都是用栈来完成。其操作方式cM于数据结构中的栈?br>2、堆区(heapQ?nbsp;Q一般由E序员手动申请以及释放, 若程序员不释放,E序l束时可能由OS回收 。注意它与数据结构中的堆是两回事Q分配方式类g链表?br>3、全局区(静态区Q(staticQ:全局变量和静态变量的存储是放在一块的Q初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在盔R的另一块区域。程序结束后ql释攄间?nbsp;
4、文字常量区Q常量字W串是攑֜q里的?nbsp;E序l束后由pȝ释放I间?br>5、程序代码区Q存攑ևC的二q制代码?/p>
下面的例子可以完全展CZ同的变量所占的内存区域Q?br>
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化?br>main()
{
int b; //栈中
char s[] = “abc”; //栈中
char *p2; //栈中
char *p3 = “123456″; //123456\0在常量区Qp3在栈?br>static int c =0Q?//全局Q静态)初始化区
//以下分配得到?0?0字节的区域就在堆?br>p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
strcpy(p1, “123456″); //123456\0攑֜帔R区,~译器可能会它与p3所指向?#8221;123456″优化成一个地斏V?br>}
二、栈QstackQ和堆(heapQ具体的区别?br>1、在甌方式?br>栈(stackQ? 现在很多人都UC为堆栈,q个时候实际上q是指的栈。它q译器自动理Q无需我们手工控制?例如Q声明函C的一个局部变?int b pȝ自动在栈中ؓb开辟空_在调用一个函数时Q系l自动的l函数的形参变量在栈中开辟空间?br>堆(heapQ? 甌和释攄E序员控Ӟq指明大。容易生memory leak?br>在C中用malloc函数?br>如:p1 = (char *)malloc(10);
在C++中用newq算W?br>如:p2 = (char *)malloc(10);
但是注意p1本n在全局区,而p2本n是在栈中的,只是它们指向的空间是在堆中?/p>
2、申请后pȝ的响应上
栈(stackQ?只要栈的剩余I间大于所甌I间Q系l将为程序提供内存,否则报异常提示栈溢出?br>堆(heapQ? 首先应该知道操作pȝ有一个记录空闲内存地址的链表,当系l收到程序的甌Ӟ 会遍历该链表Q寻扄一个空间大于所甌I间的堆l点Q然后将该结点从I闲l点链表中删除,q将该结点的I间分配l程序。另外,对于大多数系l,会在q块内存I间中的首地址处记录本ơ分配的大小Q这P代码中的delete或free语句才能正确的释放本内存I间。另外,׃扑ֈ的堆l点的大不一定正好等于申L大小Q系l会自动的将多余的那部分重新攑օI闲链表中?/p>
3、申请大的限制
栈(stackQ?在Windows?栈是向低地址扩展的数据结构,是一块连l的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是pȝ预先规定好的Q在WINDOWS下,栈的大小?MQ也有的说是1MQM是一个编译时q定的常数Q,如果甌的空间超q栈的剩余空间时Q将提示overflow。因此,能从栈获得的I间较小?例如Q在VC6下面Q默认的栈空间大是1MQ好像是Q记不清楚了Q。当Ӟ我们可以修改Q打开工程Q依ơ操作菜单如下:Project->Setting->LinkQ在Category 中选中OutputQ然后在Reserve中设定堆栈的最大值和commit?br>注意Qreserve最gؓ4ByteQcommit是保留在虚拟内存的页文g里面Q它讄的较大会使栈开辟较大的|可能增加内存的开销和启动时间?/p>
堆(heapQ? 堆是向高地址扩展的数据结构,是不q箋的内存区域(I闲部分用链表串联v来)。正是由于系l是用链表来存储I闲内存Q自然是不连l的Q而链表的遍历方向是由低地址向高地址。一般来讲在32位系l下Q堆内存可以辑ֈ4G的空_从这个角度来看堆内存几乎是没有什么限制的。由此可见,堆获得的I间比较灉|Q也比较大?/p>
4、分配空间的效率?br>栈(stackQ?栈是机器pȝ提供的数据结构,计算Z在底层对栈提供支持:分配专门的寄存器存放栈的地址Q压栈出栈都有专门的指o执行Q这决定了栈的效率比较高。但E序员无法对其进行控制?br>堆(heapQ?是C/C++函数库提供的Q由new或malloc分配的内存,一般速度比较慢,而且Ҏ产生内存片。它的机制是很复杂的Q例如ؓ了分配一块内存,库函C按照一定的法Q具体的法可以参考数据结?操作pȝQ在堆内存中搜烦可用的够大的I间Q如果没有够大的I间Q可能是׃内存片太多Q,有可能调用pȝ功能d加程序数据段的内存空_q样有Z分到_大小的内存,然后q行q回。这样可能引发用h和核心态的切换Q内存的甌Q代价变得更加昂c显Ӟ堆的效率比栈要低得多?/p>
5、堆和栈中的存储内容
栈(stackQ?在函数调用时Q第一个进栈的是主函数中子函数调用后的下一条指令(子函数调用语句的下一条可执行语句Q的地址Q然后是子函数的各个形参。在大多数的C~译器中Q参数是由右往左入栈的Q然后是子函C的局部变量。注意:静态变量是不入栈的?当本ơ函数调用结束后Q局部变量先出栈Q然后是参数Q最后栈指针指向最开始存的地址Q也是dC子函数调用完成的下一条指令,E序p点l运行?br>堆(heapQ?一般是在堆的头部用一个字节存攑֠的大,堆中的具体内ҎE序员安排?/p>
6、存取效率的比较
q个应该是显而易见的。拿栈上的数l和堆上的数l来_
void main()
{
int arr[5]={1,2,3,4,5};
int *arr1;
arr1=new int[5];
for (int j=0;j<=4;j++)
{
arr1[j]=j+6;
}
int a=arr[1];
int b=arr1[1];
}
上面代码中,arr1Q局部变量)是在栈中Q但是指向的I间在堆上Q两者的存取效率Q当然是arr高。因为arr[1]可以直接讉KQ但是访问arr1[1]Q首先要讉K数组的v始地址arr1Q然后才能访问到arr1[1]?/p>
总而言之,a而MQ?br>堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜Q声明变量)、付钱、和吃(使用Q,吃饱了就赎ͼ不必理会切菜、洗菜等准备工作和洗、刷锅等扫尾工作Q他的好处是快捷Q但是自由度?br>使用堆就象是自己动手做喜Ƣ吃的菜_比较ȝQ但是比较符合自q口味Q而且自由度大
C/C++应该是大学里最先接触的~程语言Q它们的重要性不a而喻。但是我始终q“数组名就是指?#8221;的错误信条到现在Q可能是因ؓ大学老师错误的讲解我一直保留着q种误解。指针是C/C++语言的特Ԍ而数l名与指针有太多的相|甚至很多时候,数组名可以作为指针用,所以也隑օ在学习中两者淆。这里介l下指针和数l名的区?
1.指针和数l名占据的内存空间大不一P如下E序1Q?br>
char str[10];
char *pstr=str;
cout<
cout<<sizeof
W一行输出结果是Q?0Q第二行输出l果是:4
从这里我们可以看出:数组名对应着Q而不是指向)一块内存(数组所占的内存区域Q或者说是指代数l这U数据结构,其地址与容量在生命期内保持不变Q只有数l的内容可以改变。指针对应着一个占?个字节(Win32Q的内存区域Q而指向这4个字节所存储的地址所对应的内存单元,它可以指向Q意类型的内存块。因此,sizeof(str)gؓ数组占据的内存空间大即10个字节,而sizeof(pstr)gؓ指针的值占据的内存I间大小?个字节?/strong>
2.数组名不是指针,但是在一定的情况下{换ؓ指代数组的首地址的指针,而这个数l名转ؓ的指针只能是指针帔R?br>在以下两U情况下才能q行q种转换Q?br>a.在程?W二行代码中Q将数组名直接赋值给指针Q此时数l名转换为指向数l的首单元的帔R指针?br>b.直接数l名作ؓ指针形参的时候,数组名则转换为指向数l的首单元的帔R指针q行传递,如下E序2Q?br>
void fun(char str[])
{
cout<
str++;
}
void main()
{
…
char str1[5];
fun(str1);
…
}
注意Q数l名作ؓ函数形参q行传递时Q在子函C内,它已l不再是一个指针常量,而是变成一个真正的指针Q可以进行增减等操作Q可以被修改。所以程?中子E序W一条语句输出的sizeof(str)的gؓ4.
既然数组名可以被看作指针帔RQ而常量是不能修改的,那么如下代码是不允许的:
char str[10];
str++;
但如下代码则合法的:
char str[10];
char *pstr=str;
pstr++;
3.使用指针讉K数组和用数l名讉K数组本质不同?br>例如Q?br>
char str[7]=”ksarea”;
char *pstr=str;
cout<
……
case 帔R表达式n:
语句n;
break;
default:
语句n+1;
break;
}
在java.lang.Math中有个Math.random()ҎQ它可以产生0-1之间Q包?但不包括1Q的L数
在Java中我们可以用java.util.RandomcL产生一个随机数发生器。它有两UŞ式的构造函敎ͼ分别是Random()和Random(long seed)。Random()使用当前旉即System.currentTimeMillis()作ؓ发生器的U子QRandom(long seed)使用指定的seed作ؓ发生器的U子?/p>
随机数发生器(Random)对象产生以后Q通过调用不同的methodQnextInt()、nextLong()、nextFloat()、nextDouble(){获得不同类型随机数?/p>
1>生成随机?br> Random random = new Random();
Random random = new Random(100);//指定U子?00
random调用不同的方法,获得随机数?br> 如果2个Random对象使用相同的种子(比如都是100Q,q且以相同的序调用相同的函敎ͼ那它们返回值完全相同。如下面代码中两个Random对象的输出完全相?br> import java.util.*;
class TestRandom {
public static void main(String[] args) {
Random random1 = new Random(100);
System.out.println(random1.nextInt());
System.out.println(random1.nextFloat());
System.out.println(random1.nextBoolean());
Random random2 = new Random(100);
System.out.println(random2.nextInt());
System.out.println(random2.nextFloat());
System.out.println(random2.nextBoolean());
}
}
2>指定范围内的随机?br> 随机数控制在某个范围?使用模数q算W?
import java.util.*;
class TestRandom {
public static void main(String[] args) {
Random random = new Random();
for(int i = 0; i < 10;i++) {
System.out.println(Math.abs(random.nextInt())%10);
}
}
}
获得的随机数有正有负的,用Math.abs使获取数据范围ؓ非负?/p>
3>获取指定范围内的不重复随机数
import java.util.*;
class TestRandom {
public static void main(String[] args) {
int[] intRet = new int[6];
int intRd = 0; //存放随机?br> int count = 0; //记录生成的随机数个数
int flag = 0; //是否已经生成q标?br> while(count<6){
Random rdm = new Random(System.currentTimeMillis());
intRd = Math.abs(rdm.nextInt())%32+1;
for(int i=0;i<count;i++){
if(intRet[i]==intRd){
flag = 1;
break;
}else{
flag = 0;
}
}
if(flag==0){
intRet[count] = intRd;
count++;
}
}
for(int t=0;t<6;t++){
System.out.println(t+"->"+intRet[t]);
}
}
}
1Q要注意不同的函数是否接受空格符、是否舍弃最后的回RW的问题!
d字符Ӟ
scanf()以SpaceI格、Enter、Tabl束一ơ输入,不会舍弃最后的回RW(卛_车符会残留在~冲ZQ,Q区别读字符串时会清楚)//所以可以用getchar()清除Q?/p>
getchar()以Enterl束输入Q也不会舍弃最后的回RW;
d字符串时Q?/p>
scanf()以Space、Enter、Tabl束一ơ输入,会舍弃最后的回RW(区别dW时Q和所有的I格{等?o:p>
gets()以Enterl束输入Q空gl束Q,接受I格Q会舍弃最后的回RW!
W二Qؓ了避免出Cq问题,必须要清I缓冲区的残留数据,可以用以下的Ҏ解决Q?/p>
Ҏ1QC语言里提供了函数清空~冲区,只要在读数据之前先清I缓冲区没问题了!
q个函数是fflush(stdin)?/p>
Ҏ2Q自己取出缓冲区里的D留数据?/p>
scanf("%[^\n]",string);
-------------------------一. cin<<
该操作符是根据后面变量的cdd数据?/p>
输入l束条g Q遇到Enter、Space、Tab键?q个很重要!)
对结束符的处?Q清楚缓冲区中得输入结束的l束W?Enter、Space、Tab)
(q里有一炚w题,二.cin.get()
该函数有三种格式Q无参,一参数Q二参数
即cin.get(), cin.get(char ch), cin.get(array_name, Arsize)
QiQ读取字W的情况Q?/p>
输入l束条gQEnter键(遇空gl束Q?/p>
对结束符处理Q不丢弃~冲Z的Enter
cin.get() ?cin.get(char ch)用于d字符Q他们的使用是相似的Q?/p>
卻Ich=cin.get() ?cin.get(ch)是等L?br>
试E序Q?br>#include <iostream>
using namespace std;
int main()
{
char c1, c2;
cin.get(c1);
cin.get(c2);
cout<<c1<<" "<<c2<<endl; // 打印两个字符
cout<<(int)c1<<" "<<(int)c2<<endl; // 打印q两个字W的ASCII?/p>
return 0;
}
试一输入Q?/p>
a[Enter]
输出:
a
97 10
【分析】会发现只执行了一ơ从键盘输入Q显然第一个字W变量取?a', W二个变量取的是Enter(ASCIIgؓ10)Q这是因函数不丢弃上ơ输入结束时的Enter字符Q所以第一ơ输入结束时~冲ZD留的是上次输入l束时的Enter字符Q?/p>
试二输入:
a b[Enter]
输出Q?/p>
a
97 32
【分析】显然第一个字W变量取?a', W二个变量取的是Space(ASCIIgؓ32)。原因同上,没有丢弃Space字符?/p>
QiiQ读取字W串的情况:
cin.get(array_name, Arsize)是用来读取字W串的,可以接受I格字符Q遇到Enterl束输入Q按照长?Arsize)d字符, 会丢弃最后的Enter字符?/p> Qi i iQcin.getline()
cin.getline() ?cin.get(array_name, Arsize)的读取方式差不多Q以Enterl束Q可以接受空格字W。按照长?Arsize)d字符, 会丢弃最后的Enter字符?/p>
但是q两个函数是有区别的Q?/p>
cin.get(array_name, Arsize)
当输入的字符串超长时Q不会引起cin函数的错误,后面的cin操作会l执行,只是直接从缓冲区中取数据。但是cin.getline()
当输入超长时Q会引vcin函数的错误,后面的cin操作不再执行。(具体原因在下一部分"cin的错误处?中详l介l)
------------
cin的错误处?br>
E序执行时有一个标志变量来标志输入的异常状态,其中有三位标志位分别用来标志三种异常信息Q他们分别是Q?/span>failbitQ?/span>eofbitQ?/span>badbit。这三个标志位在标志变量中是q样分配的:
____________________________________
| 2 | 1 | 0 |
| failbit | eofbit | badbit |
|___________|__________|___________|
看一下这几个标志位的作用(引用msdn)Q?/span>
badbit, to record a loss of integrity of the stream buffer.
eofbit, to record end-of-file while extracting from a stream.
failbit, to record a failure to extract a valid field from a stream.
In addition, a useful value is goodbit, where no bits are set.
接下来我么看几个ioscȝ数据定义(引用msdn)Q?/span>
typedef T2 iostate;
static const iostate badbit, eofbit, failbit, goodbit;
q里ioscd义了q四个常?/span>badbit, eofbit, failbit, goodbitQ其实这四个标志帔R是取对应标志位的掩码,也即输入的四U异常情况!
以上四个帔R对应的取gؓQ?/span>
ios::badbit 001 输入Q输出)出现致命错误,不可挽回
ios::eofbit 010 已经到达文g?/span>
ios::failbit 100 输入Q输出)出现非致命错误Q可挽回
ios::goodbit 000 状态完全正?/span>, 各异常标志位都ؓ0
如果出现输入错误Q则cin不再工作Q我们可以用cin.clear()重置标记位?span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
试E序Q?/span>
#include <iostream>
using namespace std;
int main ()
{
char ch, str[20];
cin.getline(str, 5);
cout<<"flag1:"<<cin.good()<<endl; // 查看goodbit状态,x否有异常
cin.clear(); // 清除错误标志
cout<<"flag1:"<<cin.good()<<endl; // 清除标志后再查看异常状?/span>
cin>>ch;
cout<<"str:"<<str<<endl;
cout<<"ch :"<<ch<<endl;
return 0;
}
试输入Q?/span>
12345[Enter]
输出Q?/span>
flag1:0 // good()q回false说明有异?/span>
flag2:1 // good()q回true说明Q?/span>clear()已经清除了错误标?/span>
str:1234
ch :5
但是当前一ơ读取数据出错后Q如果缓冲区没有清空的话Q重|错误标志还不够Q要是能缓冲区的残留数据清IZ好了哦Q下面我们再来看一个很重要的函敎ͼcin.ignore()
其实该函数最常用的方式是q样的,第一个参数设的非常大Q将W二个参数设?/span>'\n'Q这样就可以~冲Z回RW中的所有残留数据,因ؓ一般情况下前面输入D留的数据是没有用的Q所以在q行Cơ输入操作前缓冲区中所有数据清I是比较合理?/span>
如:cin.ignore(1024, '\n');
a alien born less lien never nevertheless new newborn the zebra
alien newborn 输入是字典序的,题意是讲一个单词分成两半,且两半都出现在输入中Q则此单词输出。下面的代码是对每一个单词尝试所有的分拆ҎQ一个个d找是否拆成的?/pre>个是否都存在Q如果两个字串都存在Q则输出Q同时蟩出@环(否则可能重复输出Q?/pre>其实有更高效的方法,是到每个单词前面寻找是否有他的字串Q比如newborn 前面有new,neverthelsess 前面有neverQ,有的话,再找后半部分是否在输入中?/pre>----获取子串的方法?string B = A.substr(start,length);
start为子串在A中的开始位|?
length为子串的长度例子
void main()
{
string st="ifn",b;
b=st.substr(0,2);
cout<<b;
}
l果 if----Ҏ代码
#include<iostream>
#include<cstdlib>
using namespace std;
string a[120000];
bool bsearch(string s,int n)
{
int begin=0;
int end=n-1;
int mid;
while(begin<=end)
{
mid=(begin+end)/2;;
if(a[mid]==s)
return true;
if(a[mid]>s)
{
end=mid-1;
}
else
{
begin=mid+1;
}
}
return false;
}
int main()
{
string b;
int i=0,j,k;
while(cin>>b)
{
a[i]=b;
i++;
}
for(j=1;j<i;j++)
{
for(k=1;k<a[j].size();k++)
{
string tem(a[j],0,k);
string temp(a[j],k,a[j].size());
if(bsearch(temp,i)&&bsearch(tem,i))
{
cout<<a[j]<<endl;
break;
}
}
}
//system("PAUSE");
return 0;
}
]]>
Status | In/Out | TIME Limit | MEMORY Limit | Submit Times | Solved Users | JUDGE TYPE |
---|---|---|---|---|---|---|
![]() |
stdin/stdout | 3s | 8192K | 356 | 152 | Standard |
Give you a sequence of words, can you sort them in dictionary order?
eg.
yes accidental baby accept accidentIn dictionary order, those words should be printed as the following
accept accident accidental baby yesBut we will make an interesting rule this time. See your keyboard or the picture below:
yes accidental baby accept accident
baby accident accidental accept yes
int main()
{
//freopen("s.txt","r",stdin);
//freopen("key.txt","w",stdout);
int n;
int temp;
while(cin>>n)
{
cout<<setw(5)<<n<<" -> " ;
temp=1;
for(int j=1;j<=n;j++)
{
int i=j;
while(i%10==0)
{
i/=10;
}
while(i%5==0)
{
i/=5;
temp/=2;
}
temp*=i;
//¼ÆËãĩλ
temp%=100000;
}
while(temp%10==0)
temp/=10;
temp%=10;
cout<<temp<<endl;
}
//system("PAUSE");
return 0;
}
一U是分类的思想
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
long a[10001]={0,1,2,6,4,2},b[5]={0,2,4,8,6},i,m,n;
for(i=6;i<=10000;i++)
{
m=i%5;
n=i/5;
if(m!=0)
a[i]=a[i-1]*i%10;
else
a[i]=b[(n-1)%4+1]*a[n]%10;
}
while(cin>>n)
cout<<setw(5)<<n<<" -> "<<a[n]<<endl;
return 0;
}
Status | In/Out | TIME Limit | MEMORY Limit | Submit Times | Solved Users | JUDGE TYPE |
---|---|---|---|---|---|---|
![]() |
stdin/stdout | 3s | 8192K | 135 | 46 | Standard |
You, as a member of a development team for a new spell checking program, are to write a module that will check the correctness of given words using a known dictionary of all correct words in all their forms.
If the word is absent in the dictionary then it can be replaced by correct words (from the dictionary) that can be obtained by one of the following operations:
Your task is to write the program that will find all possible replacements from the dictionary for every given word.
The first part of each test case contains all words from the dictionary. Each word occupies its own line. This part is finished by the single character '#' on a separate line. All words are different. There will be at most 10000 words in the dictionary.
The next part of the test case contains all words that are to be checked. Each word occupies its own line. This part is also finished by the single character '#' on a separate line. There will be at most 50 words that are to be checked.
All words in the input (words from the dictionary and words to be checked) consist only of small alphabetic characters and each one contains 15 characters at most.
The first line of the input contains an integer N, which is the number of test cases in the input, followed by N test cases described above.
1 i is has have be my more contest me too if award # me aware m contest hav oo or i fi mre #
Scenario #1: me is correct aware: award m: i my me contest is correct hav: has have oo: too or: i is correct fi: i mre: more me
You have decided that PGP encryptation is not strong enough for your email. You have decided to supplement it by first converting your clear text letter into Pig Latin before encrypting it with PGP.
You are to write a program that will take in an arbitrary number of lines of text and output it in Pig Latin. Each line of text will contain one or more words. A ``word'' is defined as a consecutive sequence of letters (upper and/or lower case). Words should be converted to Pig Latin according to the following rules (non-words should be output exactly as they appear in the input):
This is the input.
hisTay isay hetay inputay.
4 1 4 4 1 2 5 5 2
Yes
1Q这U类似稀疏矩늚数组对一般不用数l存储,用结构体比较?/pre>2Q排序后比较非常的y妙?/pre>#include<iostream> #include<cstdlib> using namespace std; struct mm{ double a; double b;}M[100000]; bool operator<(mm m1,mm m2) { if(m1.a<m2.a) return true; else { if(m1.a==m2.a&&m1.b<m2.b) return true; } return false; } int main() { // freopen("s.txt","r",stdin); // freopen("key.txt","w",stdout); int num; double a,b; int temp=0; while(cin>>num) { memset(M,0,sizeof(M)); temp=0; for(int k=0;k<num;k++) { cin>>a>>b; if(a<b) { M[temp].a=a; M[temp].b=b; temp++; } else if(a>b)//把a和b相等的都L? { M[temp].a=b; M[temp].b=a; temp++; } } if(temp%2!=0)cout<<"No"<<endl; else { sort(M,M+temp); int flag=0; for(int p=0;p<temp;p+=2) { if(M[p].b!=M[p+1].b||M[p].a!=M[p+1].a) { flag=1;break; } } if(flag==0) cout<<"Yes"<<endl; else cout<<"No"<<endl; } } //system("PAUSE"); return 0; }
]]>